Во-первых, он проверяет, известно ли, что Kind
из DateTime
является UTC. Если это так, он возвращает то же значение.
В противном случае предполагается, что это местное время - это локально по отношению к компьютеру, на котором он запущен, и, в частности, в часовом поясе, который использовался компьютером, когда некоторое частное свойство было сначала лениво инициализировано. Это означает, что если вы измените часовой пояс после вашего приложения, есть большая вероятность, что оно все еще будет использовать старое.
Часовой пояс содержит достаточно информации, чтобы преобразовать местное время в UTC или наоборот, хотя бывают случаи, когда это неоднозначно или недопустимо. (Существуют локальные времена, которые происходят дважды, и локальные времена, которые никогда не происходят из-за перехода на летнее время.) Правила обработки этих случаев указаны в документации :
Если значение экземпляра даты и времени равно
неоднозначное время, этот метод предполагает
что это стандартное время. (An
неоднозначное время - это то, что может отображать
или к стандартному времени или к
летнее время по местному времени
зона) Если дата и время экземпляра
значение является неверным временем, этот метод
просто вычитает местное время из
смещение UTC местного часового пояса к
возврат UTC. (Недопустимое время
что не существует из-за
применение летнего времени
Правила корректировки.)
Возвращаемое значение будет иметь Kind
из DateTimeKind.Utc
, поэтому, если вы вызовете ToUniveralTime
, оно не будет применять смещение снова. (Это значительное улучшение по сравнению с .NET 1.1!)
Если вы хотите использовать нелокальный часовой пояс, вы должны использовать TimeZoneInfo
, который был представлен в .NET 3.5 (есть хакерские решения для более ранних версий, но они не очень хороши). Чтобы представить момент времени, вы должны рассмотреть возможность использования DateTimeOffset
, который был представлен в .NET 2.0SP1, .NET3.0SP1 и .NET 3.5. Однако, это все еще не имеет фактического часового пояса, связанного с ним - только смещение от UTC. Это означает, что вы не знаете, какое местное время будет, например, через час - правила перехода на летнее время могут различаться в зависимости от часовых поясов, в которых в тот или иной момент использовалось одно и то же смещение. TimeZoneInfo
предназначен для учета исторических и будущих правил, в отличие от TimeZone
, что несколько упрощенно.
По сути, поддержка в .NET 3.5 намного лучше, чем была, но все же оставляет желать лучшего для правильной календарной арифметики. Кто-нибудь хочет перенести Joda Time на .NET? ;)