У меня есть программа, в которой пользователи по всему миру могут настроить, чтобы задача всегда выполнялась в X: YZ часов. В их местное время, круглый год.
Я думал о сохранении метки времени в смещении UT C, но это создает проблему, заключающуюся в том, что полугодовая разница между настроенным временем и рассчитанным временем равна по UT C. (например, когда я настраиваю его на 10:00 в Германии 25 ноября, это будет 09:00 UT C. Но в мае это внезапно будет 11:00 в Германии, потому что теперь смещение UT C равно два часа.
Однако сохранение только времени в базе данных приводит к проблеме, заключающейся в том, что некоторые часы просто не существуют в определенные дни года. Когда часы перемещаются вперед, время скачет с 1:59 непосредственно до 3:00. Любое время между 2:00 и 2:59 в этот конкретный день недопустимо.
Но как мне выяснить, что определенное время в определенный день в определенном часовом поясе недопустимо?
Редактировать Я тестировал TimeZoneInfo.IsInvalid()
, но, похоже, он не работает:
В воскресенье, 29 марта 2020 года, не было часа 02 : 30:00. И все же IsInvalid()
сообщает false
:
var tzi = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
var isInvalid = tzi.IsInvalidTime(new DateTime(2020, 3, 29, 2, 30, 0, DateTimeKind.Local));
Изменить 2
Хорошо, нужно отметить отметку времени как неопределенную для IsInvalidTime()
для правильной работы:
var isInvalid = tzi.IsInvalidTime(new DateTime(2020, 3, 29, 2, 30, 0, DateTimeKind.Unspecified));