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


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

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

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

6 84

6 ответов:

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

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

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

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

нет.

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

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

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

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

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

вы могли бы использовать TimeZoneInfo класс

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

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

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

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

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

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

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

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

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

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