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

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

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

 DateTime.Now
 DateTime.UtcNow
 TimeZone.CurrentTimeZone

Конечно, решение должно учитывать переход на летнее время.

См. stackoverflow.com/questions/27415652/…

Jay 12.12.2014 04:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
48
1
51 930
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Как насчет

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

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

Что делать, если в вашем регионе не используется летнее время? Тогда IsDaylightSavingTime вернет false.

Jon B 14.01.2009 01:39

Летнее время не влияет на UTC; конечно, нам нужно знать летнее время на Востоке, а не местным жителям.

Marc Gravell 14.01.2009 01:40

Понял ... Я не знаю, можно ли создать объект часового пояса для другого часового пояса, который установлен на компьютере. И вам нужно было бы создать объект часового пояса от восточного времени, чтобы определить, летнее время там или нет ...

Charles Bretana 14.01.2009 01:44

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

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

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

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

Но этого просто нет в 2.0; Извините.

Несмотря на то, что он не находился в рамках ограничений OP, он ответил на МОЙ вопрос, поэтому я изменил это :)

Chris 22.04.2009 08:00

Спасибо! Я просто хочу добавить это: ReadOnlyCollection<TimeZoneInfo> tz = TimeZoneInfo.GetSystemTimeZones(); DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, tz[0].Id);

DmitryBoyko 19.02.2013 16:47

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

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

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

Ответ принят как подходящий

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

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

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

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

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

Ссылка на Archive.org: web.archive.org/web/20090807133141/http://burks.brighton.ac.‌ uk /…

orev 24.05.2017 23:19

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

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

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

Пожалуйста, также смотрите

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

Другие вопросы по теме