Получить часовой пояс из DateTime

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

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

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

Ответ 1

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

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

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

EDIT: Почти четыре года спустя я предлагаю использовать Noda Time, который имеет более богатый набор типов даты и времени. Я смещен, хотя, как главный автор Noda Time:)

Ответ 2

Нет.

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

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

Итак, мой совет - написать небольшой класс-оболочку, соответствующий вашим потребностям.

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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