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