Вам следует избегать установки tm_isdst в -1, если это возможно. Система не всегда может определить состояние летнего времени только по дате и времени. Это неоднозначно час до и после окончания летнего времени. Например, если вы передаете mktime()
1:30 AM 4 ноября 2012 г., этого недостаточно для получения правильного значения time_t
из mktime()
. Обычно я видел mktime()
предполагаемое стандартное время в случае его неоднозначности, но я не видел никакой документации, которая бы гарантировала такое поведение на всех платформах. 1:30 утра 4 ноября 2012 года с tm_isdst == 1
будет на 1 час раньше, потому что час с 1:00:00 до 1:59:59 повторяется.
#include <stdio.h>
#include <time.h>
int main()
{
time_t daylight, standard;
struct tm timestr;
double diff;
timestr.tm_year = 2012 - 1900;
timestr.tm_mon = 11 - 1;
timestr.tm_mday = 4;
timestr.tm_hour = 1;
timestr.tm_min = 30;
timestr.tm_sec = 0;
/* first with standard time */
timestr.tm_isdst = 0;
standard = mktime(×tr);
/* now with daylight time */
timestr.tm_isdst = 1;
daylight = mktime(×tr);
diff = difftime(standard, daylight);
printf("Difference is %f hour(s)", diff/60.0/60.0);
return 0;
}
Это производит:
Difference is 1.000000 hour(s)
Оба - 4 ноября 2012 года, 1:30, однако оба представляют собой два разных значения time_t с интервалом в 1 час.
mktime()
по существу имеет 2 выхода:
- time_t
- отремонтированная структура времени
Структура времени является одновременно входом и выходом. Он изменяется mktime()
, чтобы вернуть все элементы структуры в номинальные диапазоны. Например, если вы увеличиваете член tm_hour += 500
, это означает увеличение времени на 500 часов. Элемент tm_hour
будет изменен на значение от 00 до 23, а значения tm_day
, tm_mday
и т. Д. Будут соответствующим образом скорректированы. tm_isdst
также является входом и выходом. Его значения следующие:
- 1 (действующее летнее время, т.е. дневное время)
- 0 (летнее время не действует, т.е. стандартное время)
- -1 (неизвестный статус DST)
Таким образом, mktime () выведет 1 или 0 для tm_isdst, а не -1.
-1 - это возможный ввод , но я думаю, что это означает «Неизвестно». Не думайте, что это означает «определять автоматически», потому что в общем случае mktime()
не всегда может определить это автоматически.
Явное состояние DST (0 или 1) должно исходить от чего-то внешнего от программного обеспечения, например, сохранять его в файле или базе данных или запрашивать у пользователя.