Подтвердить что ты не робот

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

Независимо от того, какой пользовательский часовой пояс установлен, используя С# (.NET 2.0), мне нужно определить время (объект DateTime) в восточном часовом поясе.

Я знаю об этих методах, но, похоже, нет очевидного способа получить объект DateTime для другого часового пояса, чем тот, в котором находится пользователь.

 DateTime.Now
 DateTime.UtcNow
 TimeZone.CurrentTimeZone

Конечно, решение должно быть осведомлено о летнем времени.

4b9b3361

Ответ 1

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

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \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);

На этой странице есть сводная информация: http://burks.brighton.ac.uk/burks/language/pascal/uddf/pages/registry.htm

Ответ 2

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

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

Итак, в 3.5 я думаю, вы можете сделать что-то вроде:

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

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

Ответ 3

От - 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.");
}

Ответ 4

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

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

Ответ 5

Как насчет

 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 -forward и датируйте даты для восточного времени в течение следующих 50 лет.. Это всего 300 байт или около того... и затем укажите на это, чтобы определить, время на восточном побережье... Как уже указывалось, вы не заботитесь о том, является ли это dST в местной зоне или нет...

 private static bool IsEasternDaylightSavingTime(DateTime utcDateTime)
   {
        // hard coded method to determine 
        // whether utc datetime is Eastern Standard time
        // or Eastern Daylight Time
   }

Ответ 6

Сравнение дат - это сравнение дат. DateTime просто обертывает структуру памяти, которая определена в тиках, и делает способы доступа к обычно используемым частям памяти, например. день или год или время или время и время и т.д.

Кроме того, преобразование возможно только в том случае, если вы знаете как смещения назначения источника snd, а затем вычисление всегда задано с помощью -1 * (sourceOffset - destOffset)

Где часть в скобках представляет разницу в часовом поясе.

Также см.

Получите восточное время в С# без преобразования локального времени