Получите DateTime для другого часового пояса независимо от зоны местного времени

44
задан Dave 14 January 2009 в 08:31
поделиться

5 ответов

Как все остальные упомянули.NET 2 не содержит информации о часовом поясе. Информация хранится в реестре, тем не менее, и его довольно тривиальном для записи класса обертки вокруг этого:

SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones

содержит подключи навсегда зоны. Значение поля TZI содержит весь переход и свойства предвзятости какое-то время зона, но это все наполнено в двоичном массиве. Самые важные биты (предвзятость и дневной свет), int32s, сохраненный в положениях 0 и 8 соответственно:

int bias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 0);
int daylightBias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 8);

Вот архив , Как получить информацию о часовом поясе (DST) из реестра?

8
ответ дан KyleMit 4 August 2019 в 16:56
поделиться

В.NET 3.5, существует TimeZoneInfo , который обеспечивает большую функциональность в этой области; 2.0SP1 имеет DateTimeOffset , но это намного более ограничено.

Получение UtcNow и добавление фиксированного смещения является частью задания, но не осведомлено о DST.

Так в 3,5 я думаю, что можно сделать что-то как:

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
    DateTime.UtcNow, "Eastern Standard Time");

, Но это просто не существует в 2,0; извините.

86
ответ дан Marc Gravell 4 August 2019 в 16:56
поделиться

Я сэкономлю Вам время и скажу Вам, что нет никакого пути в надлежащем .net, версия 2.0 для получения объекта DateTime для другого часового пояса, отличающегося от того, на котором программное обеспечение работает (кроме UTC).

Однако, который не означает, нет способа сделать это за пределами .net. Смотрите здесь в классе TimeZoneInformation. Этот класс обертывает некоторый материал p/invoke к Победе O/S для получения информации часового пояса от O/S. Я успешно использовал его назад, когда 2.0 было новым, и это работало очень хорошо. Сайт я продолжал работать, должен был быть в состоянии показать каждую дату/время, локальную для пользователя, и должен был быть осведомлен о DST, и этот класс подошел для нас.

2
ответ дан Robert C. Barth 4 August 2019 в 16:56
поделиться

Как насчет

 DateTime lclTime = DateTime.Now;
 DateTime ept = lclTime.ToUniversalTime().AddHours(
                   IsEasternDaylightSavingTime(
                       lclTime.ToUniversalTime())? -5: -4)

или если Вы уже имеете локальный UTC, всего

 DateTime lclUtc = DateTime.UtcNow;
 DateTime ept = lclUtc.AddHours(
                  IsEasternDaylightSavingTime(lclUtc)? -5: -4)

Использование статический словарь твердых кодированных значений для Spring вперед и отступаете даты в течение Восточного времени в течение следующих 50 лет.. Это составляет приблизительно только 300 байтов..., и затем индексируйте в это, чтобы определить, является ли это Летним временем на восточном побережье... Как указано, Вы надеваете; t заботятся, является ли это DST в локальной зоне или нет...

 private static bool IsEasternDaylightSavingTime(DateTime utcDateTime)
   {
        // hard coded method to determine 
        // whether utc datetime is Eastern Standard time
        // or Eastern Daylight Time
   }
1
ответ дан Charles Bretana 4 August 2019 в 16:56
поделиться

От - http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx

Это позволяет часовому поясу быть найденным по имени, в случае, если США когда-либо пускают в ход 15 градусов на запад или восток от лондонского меридиана.

DateTime timeUtc = DateTime.UtcNow;
try
{
   TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
   DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
   Console.WriteLine("The date and time are {0} {1}.", 
                     cstTime, 
                     cstZone.IsDaylightSavingTime(cstTime) ?
                             cstZone.DaylightName : cstZone.StandardName);
}
catch (TimeZoneNotFoundException)
{
   Console.WriteLine("The registry does not define the Central Standard Time zone.");
}                           
catch (InvalidTimeZoneException)
{
   Console.WriteLine("Registry data on the Central STandard Time zone has been corrupted.");
}
6
ответ дан Christopher Edwards 4 August 2019 в 16:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: