Сравнение времени UTC с местным временем в C#

У меня есть консольное приложение Windows в C#, которое нужно сравнить текущее время с двумя временами, хранящимися в БД. Дата и время конвертируются в UTC перед вставкой в ​​БД. Теперь мне нужно получить эти значения и сравнить только часть времени с местным временем. Скажем, мои даты следующие:

DateTime dt1 = new DateTime(2013, 08, 29, 00, 00, 00)
DateTime dt2 = new DateTime(2013, 08, 29, 23, 59, 59)

поскольку я конвертирую эти две даты в UTC и сохраняю их в БД, мои значения в БД выглядят как "28 августа 2013 года 18:30:00" и "29 августа 2013 года 18:00:00".

Допустим, мое текущее местное время составляет '14:00:00', и мое условие для проверки состоит в том, что мое местное время должно быть в промежутке между значениями моего БД Datetime. подобно

if(DateTime.Now.TimeOfDay >= DBTime1 && DateTime.Now.TimeOfDay <= DBTime2)`
{
//true condition logic
}

Если я конвертирую дату в БД в локальную и сравниваю, то в моей локальной системе она работает как положено. Я сомневаюсь, что если приложение будет размещаться на сервере в Великобритании и получать к нему доступ из Индии, будет ли сравнение времени работать так, как ожидается? Нужно ли учитывать какие-либо другие вещи, такие как летнее время (DST) или TimeZone, при конвертации в местное время?

2 ответа

Кажется, в.NET есть ошибка (или ужасный выбор дизайна). Как вы можете видеть в справочном источнике, начинающемся со строки 1221, DateTime код сравнения просто сравнивает InternalTicks свойство, которое имеет не скорректированные по часовому поясу тики. Это означает, что этот код:

if (ticket.Expiration > DateTime.UtcNow)

ведет себя иначе, чем этот код:

if (ticket.Expiration.ToUniversalTime() > DateTime.UtcNow)

даже когда DateTimeKind явно и правильно установлено.

DateTime.Now.TimeOfDay имеет тип DateTimeKind.Local

DBTime1, как хранится в БД, является временем Utc и должно быть "гидратировано" в C# как DateTimeKind.Utc

( DateTimeKind info)

Поскольку время в БД указано в формате UTC, при преобразовании в местное время, при условии, что информация о местном времени (включая часовой пояс, летнее время и т. Д.) Установлена ​​правильно, я не могу понять, почему преобразование одного из них в формат другого и сравнение выйдет не так. На самом деле было бы проще пойти другим путем и просто использовать DateTime.UtcNow:

DateTime.UtcNow.TimeOfDay >= DbTime1 && DateTime.UtcNow.TimeOfDay <= DBTime2

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

Другие вопросы по тегам