Как использовать TimeZoneInfo для получения местного времени во время летнего времени?

Я пытаюсь использовать DateTimeOffset для передачи определенного момента времени в любом часовом поясе. Я не могу понять, как использовать TimeZoneInfo для работы с летним временем.

var dt = DateTime.UtcNow; Console.WriteLine(dt.ToLocalTime()); var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero); Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset)); 

Это печатает:

 6/2/2010 4:37:19 PM 6/2/2010 3:37:19 PM -06:00 

Я нахожусь в центральном часовом поясе, и сейчас мы находимся в летнее время. Я пытаюсь прочитать вторую строку:

 6/2/2010 4:37:19 PM -05:00 

По-видимому, BaseUtcOffset не изменяется на основе DST.

Как я могу получить нужное время с правильным значением смещения?

Вам нужно получить UtcOffset из TimeZoneInfo, а затем передать это методу ToOffset ():

 var dt = DateTime.UtcNow; Console.WriteLine(dt.ToLocalTime()); var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero); Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset))); 

Вы также можете использовать TimeZoneInfo.ConvertTimeFromUtc, что позволит использовать летнее время:

 DateTime utc = DateTime.UtcNow; TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone); 

Или лучше, если вы не хотите жестко кодировать идентификатор часового пояса :

 TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id); DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi); 

Я новичок как в .NET, так и в stackoverflow, поэтому я могу ошибаться, но здесь говорится:

Использование TimeZoneInfo.ConvertTimeFromUtc позволит использовать летнее время и конвертировать в правильное время в соответствии с часовым поясом + возможное смещение DST. Однако – само смещение в результирующем объекте будет отображать смещение для стандартного времени и не учитывать летнее время. Поэтому, если вы хотите сделать ToString на объекте, вы получите правильное время (в часах и минутах), но неправильное смещение во время летнего времени, что может привести к неправильному моменту времени позже в коде.

Если вы используете GetUtcOffset для получения смещения в течение определенного времени, а затем выполните ToOffset на объекте DateTimeOffset, то как часы / минуты, так и само смещение будут правильно преобразованы, и вы можете безопасно выполнить ToString.

 string ExpectedDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss''zzz"; string timeZoneId = "FLE Standard Time"; string dateTimestr = "2017-10-09T09:00:00+02:00"; DateTimeOffset dto = DateTimeOffset.Parse(dateTimeStr); TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); TimeSpan offset = zone.GetUtcOffset(dto); dto = dto.ToOffset(offset); string localTime = dto.ToString(ExpectedDateTimePattern); 

localTime вернется «2017-10-09T10: 00: 00 + 03: 00».

datetimeoffset timezoneinfo getutcoffset

  • Названия часовых поясов с одинаковыми свойствами дают разные результаты при применении к метке времени
  • Параметр DateTime с часовым поясом формы PST / CEST / UTC / etc.
  • Как мне заполнить список часовых поясов IANA / Olson от Noda Time?
  • Могу ли я получить часовой пояс браузера в ASP.NET или мне нужно полагаться на операции JS для извлечения информации?
  • Драйвер JDBC MySQL 5.1.33 - Проблема с часовым поясом
  • ORA-01882: область часового пояса не найдена
  • Сокращения временной зоны
  • Преобразование дат UTC в другие часовые пояса
  • Получить имя часового пояса
  • Временные зоны MySQL
  • .NET TimeZoneInfo из часового пояса Олсона
  • Interesting Posts

    Java generics: Collections.max () подпись и компаратор

    Отображать текущее время в 12-часовом формате с AM / PM

    Динамически добавлять текстовые элементы в линейный режим

    Как исправить проблему «Firefox с использованием максимального процессора»?

    Цвет фона элемента меню навигации для выбранного элемента

    XMLHttpRequest не может загрузить файл. Запросы на кросс-начало поддерживаются только для HTTP

    Может ли class C # наследовать атрибуты из своего интерфейса?

    Как заставить Windows сохранять положения значков на рабочем столе?

    StoreKit В приложении Недействительные идентификаторы продукта

    Почему $ .getJSON бесшумно терпит неудачу?

    Как отключить поиск и догадывание доменов в адресной строке Firefox, сохраняя при этом другие функции?

    AppCompatActivity.onCreate можно вызывать только из одной и той же группы библиотек

    API Карт Google: заголовок «Access-Control-Allow-Origin» отсутствует на запрошенном ресурсе

    TargetedPatchingOptOut: «Производительность критична для встроенных границ графических изображений NGen»?

    Код C ++ для проверки гипотезы Collatz быстрее, чем assembly вручную – почему?

    Давайте будем гением компьютера.