Получить часовой пояс от DateTime - PullRequest
91 голосов
/ 23 февраля 2009

Содержит ли .Net DateTime информацию о часовом поясе, в котором он был создан?

У меня есть библиотека, анализирующая DateTime из формата, который имеет "+ zz" в конце, и, хотя он правильно анализирует и настраивает местное время, мне нужно получить конкретный часовой пояс из объекта DateTime.

Возможно ли это вообще? Все, что я вижу, это DateTime.Kind, который указывает местное время или UTC.

Ответы [ 6 ]

126 голосов
/ 23 февраля 2009

DateTime сама по себе не содержит информации о реальном часовом поясе. Он может знать, является ли он UTC или локальным, но не то, что на самом деле означает местный.

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

Поддержка часовых поясов в .NET 3.5 намного лучше, чем была, но мне бы очень хотелось увидеть стандартный "ZonedDateTime" или что-то в этом роде - время в формате UTC и фактический часовой пояс. Создать свой собственный легко, но было бы неплохо увидеть его в стандартных библиотеках.

РЕДАКТИРОВАТЬ: Почти четыре года спустя, я бы сейчас предложил использовать Noda Time , который имеет более богатый набор типов даты / времени. Хотя я предвзят, как главный автор Noda Time:)

33 голосов
/ 23 февраля 2009

номер

Разработчик отвечает за отслеживание информации о часовом поясе, связанной со значением DateTime, с помощью какого-либо внешнего механизма.

Цитата из отличной статьи здесь . Необходимо прочитать для каждого разработчика .Net.

Поэтому я советую написать небольшой класс-обертку, который соответствует вашим потребностям.

5 голосов
/ 24 февраля 2009

Существует публичная библиотека TimeZone для .NET . Действительно полезно. Это будет отвечать вашим потребностям.

Решение общей проблемы с часовыми поясами сложнее, чем вы думаете.

2 голосов
/ 13 марта 2012

Вы можете использовать TimeZoneInfo класс

Класс TimeZone распознает местный часовой пояс и может преобразовывать время между всемирным координированным временем (UTC) и местным временем. Объект TimeZoneInfo может представлять любой часовой пояс, а методы класса TimeZoneInfo могут использоваться для преобразования времени в одном часовом поясе в соответствующее время в любом другом часовом поясе. Члены класса TimeZoneInfo поддерживают следующие операции:

  1. Получение часового пояса, который уже определен рабочим система.

  2. Перечисление часовых поясов, доступных в системе.

  3. Преобразование времени между разными часовыми поясами.

  4. Создание нового часового пояса, который еще не определен операционная система.

    Сериализация часового пояса для последующего извлечения.

1 голос
/ 23 февраля 2009

Из API (http://msdn.microsoft.com/en-us/library/system.datetime_members(VS.71).aspx) не похоже, что он может отображать название используемого часового пояса.

0 голосов
/ 19 марта 2018

Обычно рекомендуется передавать данные как DateTime с «часовым поясом» UTC, а затем передавать объект TimeZoneInfo, и когда вы будете готовы отобразить данные, вы используете объект TimeZoneInfo для преобразования UTC DateTime.

Другой вариант - установить DateTime с текущим часовым поясом, а затем убедиться, что часовой пояс неизвестен для объекта DateTime, а затем убедиться, что DateTime снова передан с TimeZoneInfo, который указывает TimeZone переданного DateTime .

Как уже указывали другие, было бы неплохо, если бы Microsoft взяла верх над этим и создала один хороший объект, чтобы сделать все это, но сейчас вам нужно иметь дело с двумя объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...