Допустим, я разрабатываю приложение для заявок, которое работает на windows. Данный билет имеет срок действия 3 часа. Теперь, если я хочу напечатать билет 28 марта 2020 года (GMT + 1, Германия) в 23:00 (23:00:00), он должен быть действителен до 2:00 следующего утра. (Я манипулирую своим системным временем для тестирования)
Проблема в том, что 29-го DST-изменения происходят: в 2 часа ночи будет установлено значение 3 часа ночи.
Из-за перехода на летнее время билет действителен только до 1 часа ночи (технически только 2 часа), хотя фактический скачок времени происходит позже в тот же день.
Вот что я делаю:
для текущего времени я использую struct tm myTime;
myTime.tm_mday; \* = 28 *\
myTime.tm_hour; \* = 23 *\
struct tm newTime;
newTime.tm_mday = myTime.tm_mday; \* also done for remaining fields *\
newTime.tm_hour = myTime.tm_hour + 3; \* = 26 *\
пока проблем нет. В любой другой день 26 часов будут преобразованы в следующий день в 2 часа ночи.
Но если я позвоню time_t result = _mktime64( newTime );
в этом конкретном случае c, полученная метка времени (например, 1585440205) будет иметь mday = 29 и hour = 1 (при конвертации)
Есть ли другая опция, которая рассчитывает точное время часа, чтобы срок действия моего билета не терялся ни на один час? (Я предполагаю, что _mktime64 распознает изменение DST и манипулирует все время в течение дня, независимо от того, происходят ли они до или после фактического изменения времени в 2 часа ночи)