Как обрабатывать точные часы при использовании WIN32 _mktime на дату с летнее время (летнее время)? - PullRequest
0 голосов
/ 03 февраля 2020

Допустим, я разрабатываю приложение для заявок, которое работает на 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 часа ночи)

...