Как проверить местное время в 02:30 без проблем с зимним / летним временем - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть программа, в которой пользователи по всему миру могут настроить, чтобы задача всегда выполнялась в 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));

1 Ответ

0 голосов
/ 21 апреля 2020

TimeZoneInfo.IsInvalid() работает, если объект DateTime создан правильно. Он не должен иметь атрибут DateTimeKind.Local, а DateTimeKind.Unspecified

var tzi = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
var isInvalid = tzi.IsInvalidTime(new DateTime(2020, 3, 29, 2, 30, 0, DateTimeKind.Unspecified));
...