top of page

C# еще немного на тему: дата-время плюс таймзоны

  • Фото автора: Алик Ким
    Алик Ким
  • 23 мая 2024 г.
  • 1 мин. чтения

про флаг Kind.


вкратце расклад такой:

тип DateTime содержит:

1) собственно, значение времени (количество миллисекунд с какого-то там момента)

2) Kind - признак того, локальное это время, или глобальное.


у Kind есть еще третье положение - Unspecified


то есть, DateTime не хранит информацию о таймзоне


флаги локал/глобал учитываются при , например, использовании даты-времени как параметра при обращении к удаленному сервису.

формируется правильная строка времени по стандарту ISO-чето-там (.ToString("o"))


в случае флага Unspecified - поведение может быть непредсказуемым в плане преобразования в строку или сериализации (надо смотреть, проверять экспериментально).

в общем, из вот этого состояния Unspecified лучше преобразовывать как можно быстрее.


когда мы переводим дату-время в другой часовой пояс:

TimeZoneInfo cetZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");

DateTime cetTime = TimeZoneInfo.ConvertTime(DateTime.Now, cetZone);


- у результата Kind = Unspecified

нормализовать можно, конвертнув в Utc, например:

DateTime utcTime = TimeZoneInfo.ConvertTimeToUtc(cetTime, cetZone);

//тут utcTime.Kind == Utc



а есть ли DateTime с блэкджэком?


есть: DateTimeOffset

он получает TimeSpan в качестве оффсета, и потом хранит его и учитывает при операциях, я так понимаю.

ну я с ним, честно говоря, еще не работал, насчет добавленного удобства не скажу.


кстати, привязывается он не к таймзоне, а именно к оффсету (разница: у таймзон может быть разный оффсет изз перевода времени на зимнее/летнее)


 
 
 

Недавние посты

Смотреть все

Comments


Околокомпьютерный блог Алика

  • alt.text.label.Facebook

© Околокомпьютерный блог Алика , 2022. Сайт создан на Wix.com

bottom of page