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

Если бы Вы на самом деле сталкиваетесь с проблемой производительности, я предложил бы обернуть вызовы, которые добавляют/удаляют свойства, to/from объект с функцией, которая также увеличивает/постепенно уменьшает соответственно именованный (размер?) свойство.

только необходимо вычислить начальное количество свойств однажды и идти дальше оттуда. Если нет фактической проблемы производительности, не беспокоиться. Просто обертка, что бит кода в функции getNumberOfProperties(object) и быть сделанным с ним.

61
задан Ohad Schneider 22 September 2017 в 12:39
поделиться

4 ответа

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

Например, если я создаю DateTime из эпохи 01.01.1970, он дает мне один и тот же объект DateTime независимо от того, где я нахожусь.

Если я запускаю на нем ToUniversalTime () во время работы код в Гринвиче, то я получаю то же время. Если я сделаю это, живя в Ванкувере, то получу объект смещения DateTime на -8 часов.

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

Изменить: примечание из ответа Джоэла - объекты DateTime по умолчанию набираются как DateTimeKind.Local . Если вы проанализируете дату и установите ее как DateTimeKind.Utc , то ToUniversalTime () не выполнит преобразования.

А вот статья о «Лучшие методы кодирования с датой» Times » и статью о Преобразовании DateTimes с помощью .Net .

71
ответ дан 24 November 2019 в 17:16
поделиться

Во-первых, он проверяет, является ли 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? ;)

Кому-нибудь нравится переносить Joda Time на .NET? ;)

Кому-нибудь нравится переносить Joda Time на .NET? ;)

34
ответ дан 24 November 2019 в 17:16
поделиться

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

7
ответ дан 24 November 2019 в 17:16
поделиться

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

3
ответ дан 24 November 2019 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: