Как работает DateTime.ToUniversalTime() работает?



как происходит преобразование в UTC из стандартного DateTime формат работы?



более конкретно, если я создам DateTime объект в одном часовом поясе, а затем переключиться на другой часовой пояс и запуск ToUniversalTime() на нем, как он знает, что преобразование было сделано правильно и что время все еще точно представлено?

671   4  

4 ответов:

нет никакого неявного часового пояса, прикрепленного к

во-первых, он проверяет, является ли Kind на DateTime уже известно, что это UTC. Если это так, он возвращает то же значение.

в противном случае предполагается, что это локальное время - это локальное для компьютера, на котором он работает, и, в частности, в часовом поясе, который компьютер использовал, когда какая-то частная собственность была впервые лениво инициализирована. Это означает, что если вы измените часовой пояс после приложение было запущено, есть хороший шанс, что он все равно будет использовать старый.

часовой пояс содержит достаточно информации для преобразования местного времени в время UTC или наоборот, хотя бывают случаи, что это неоднозначно или недопустимо. (Есть местное время, которое происходит дважды, и местное время, которое никогда не происходит из-за летнего времени.) Правила обращения с этими случаями указаны в документация:

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

возвращаемое значение будет Kind of DateTimeKind.Utc, Так что если вы называете ToUniveralTime о том, что он не будет применять взаимозачет. (Это значительное улучшение по сравнению с .NET 1.1!)

если вы хотите не местный часовой пояс, вы должны использовать TimeZoneInfo который был представлен в .NET 3.5 (есть хакерские решения для более ранних версий, но они не хороши). Чтобы представить момент времени, вы должны рассмотреть возможность использования DateTimeOffset который был представлен в .NET 2 .0SP1,. NET3.0SP1 и .NET 3.5. Однако, это все еще не есть фактический часовой пояс, связанный с ним - просто смещение от UTC. Это означает, что вы не знаете, какое местное время будет через час, например - правила DST могут варьироваться между часовыми поясами, которые использовали одно и то же смещение для этого конкретного момента. TimeZoneInfo предназначен для учета исторических и будущих правил, в отличие от TimeZone что несколько упрощенно.

в основном поддержка в .NET 3.5 намного лучше, чем это было, но все же оставляет желать лучшего для правильной календарной арифметики. Кто-нибудь хочет портировать Джода Времени в .NET? ;)

Что @womp сказал, С добавлением, что он проверяет свойство типа DateTime, чтобы увидеть, может ли он уже быть датой UTC.

дата и время.ToUniversalTime удаляет смещение часового пояса локального часового пояса для нормализации даты и времени в формате UTC. Если вы затем используете DateTime.ToLocalTime на нормализованном значении в другом часовом поясе смещение часового пояса этого часового пояса будет добавлено к нормализованному значению для правильного представления в этом часовом поясе.

Comments

    Ничего не найдено.