Как преобразовать DateTimes в значения времени на основе UTC для сравнения времени - C #

У меня есть строка (переменная fileDate) со значениями даты в следующем формате:

2 декабря 2011 г., 11:58

Теперь я хочу преобразовать это в дату, а затем во время UTC, поскольку у меня проблемы со сравнением дат на разных машинах, поэтому * я всегда хочу преобразовать все строки (которые сравниваются) в значения Utc_date. *

Я попробовал этот код ниже, но он не сработал, так как я не могу преобразовать указанную выше строку в Datetime (так как у нее нет секунд).

DateTime date = Convert.ToDateTime(fileDate);
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
fileDate = date.ToString("MM/dd/yyyy hh:mm tt");

Выше не получилось показать FormatException. Не могли бы вы помочь?


person stack_pointer is EXTINCT    schedule 15.03.2012    source источник


Ответы (3)


Для начала я бы предложил использовать DateTime.ParseExact или TryParseExact - мне не ясно, рассчитан ли ваш образец на 2 декабря или 12 февраля. Указание формата вполне может удалить ваш FormatException.

Следующая проблема состоит в том, чтобы определить, в какой часовой пояс вы хотите его преобразовать - вы говорите, что 11:58 - это местное время в каком-то часовом поясе, или это уже Время UTC?

  • Если это местное время в часовом поясе кода, который запускает это, вы можете использовать DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal, чтобы сделать это как часть синтаксического анализа.
  • Если это уже всемирное время, используйте DateTimeStyles.AssumeUniversal
  • Если сейчас местное время в другом часовом поясе, вам нужно будет использовать TimeZoneInfo, чтобы выполнить преобразование.

Кроме того, если это местное время, вам необходимо рассмотреть два угловых случая (при условии, что вы используете часовой пояс, в котором соблюдается летнее время):

  • Местное время может быть пропущено из-за перехода на летнее время, когда часы идут вперед. Так что, если часы переходят с часу ночи до двух часов ночи, то час ночи вообще не существует.
  • Когда часы возвращаются назад, местное время может быть неоднозначным из-за перехода на летнее время. Итак, если часы переводятся с 2 до 1 ночи, то 1:30 происходит дважды в разное время UTC - какое событие вас интересует?

Вы должны решить, как вы хотите обрабатывать эти случаи, и убедиться, что они включены в ваши модульные тесты.

Другой вариант - использовать мою библиотеку даты и времени, Noda Time, которая разделяет понятия «местная дата / время »и« дата / время в определенном часовом поясе »(и другие) более подробно.

person Jon Skeet    schedule 15.03.2012
comment
Привет, Джон, да. Я столкнулся с этой проблемой с переходом на летнее время. По сути, я преобразовал оба сравниваемых значения во время UTC, но все же у меня проблема с переходом на летнее время. Как мне справиться с этим, если он меня блокирует? Спасибо за подробный ответ. - person stack_pointer is EXTINCT; 16.03.2012
comment
@stack_pointerisEXTINCT: трудно понять, в чем проблема, поскольку вы не предоставили достаточно информации. Я задавал разные вопросы, а вы еще не ответили на них. Короткий, но полный пример программы, демонстрирующий проблему, может помочь. - person Jon Skeet; 16.03.2012
comment
@stack_pointerisEXTINCT: вы до сих пор не объяснили, какой часовой пояс вас действительно интересует (код, который вы указали, будет использовать местный часовой пояс системы, хотя вы не выполнили преобразование самым простым способом - вы можете просто использовать DateTimeStyles.AdjustToUniversal). Также неясно, почему вы конвертируете обратно в строку или какая другая дата. Вы утверждаете, что это логически равно, но вы ничего об этом не показали. Короткая, но полная программа помогла бы прояснить некоторые из этих вопросов, но я подозреваю, что вы все еще действительно не уверены в том, что вам нужно ... - person Jon Skeet; 20.03.2012
comment
Привет, Джон, пожалуйста, обратитесь к моему другому сообщению [stackoverflow.com/questions/9791712/, куда я включил запрошенные данные. Спасибо - person stack_pointer is EXTINCT; 21.03.2012
comment
@stack_pointerisEXTINCT: Почему вы создали новый вопрос вместо того, чтобы просто редактировать этот? - person Jon Skeet; 21.03.2012
comment
Привет, Джон. Приносим извинения за неудобства. Я чувствовал, что в этом посте сразу было слишком много вопросов / запросов. Поэтому я разделил его и выложил новый исключительно для сравнения. В этом посте есть ваши ответы, которые помогли мне выполнить синтаксический анализ String to Date. Спасибо за информацию. - person stack_pointer is EXTINCT; 21.03.2012

вы должны использовать DateTime.ParseExact, чтобы получить значение в надлежащий экземпляр DateTime, а затем вы можете использовать .ToUniversalTime(), чтобы получить время в формате UTC (это будет связано с разницей во времени, как на вашем сервере)

person V4Vendetta    schedule 15.03.2012

вы можете использовать: DateTime.Now.ToUniversalTime();

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

http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx

person Bongo Sharp    schedule 15.03.2012