По возможности следует избегать установки tm_isdst в -1. Система не всегда может определить статус перехода на летнее время только по дате и времени. Это неоднозначно за час до и после окончания летнего времени. Например, если вы передаете mktime()
1:30 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 выхода:
- время_t
- восстановленная временная структура
Структура времени является одновременно входом и выходом. Он изменен mktime()
, чтобы вернуть все элементы структуры в номинальные диапазоны. Например, если вы увеличиваете член tm_hour += 500
, это означает увеличение времени на 500 часов. Элемент tm_hour
будет изменен на значение от 00 до 23, а tm_day
, tm_mday
и т. д. будут изменены соответствующим образом. tm_isdst
также является и входом, и выходом. Его значения следующие:
- 1 (действующее летнее время, т. е. дневное время)
- 0 (летнее время не действует, т.е. стандартное время)
- -1 (Неизвестный статус перехода на летнее время)
Таким образом, mktime() выводит либо 1, либо 0 для tm_isdst, а не -1.
-1 является возможным вводом, но я бы подумал, что это означает «Неизвестно». Не думайте, что это означает "определить автоматически", потому что в общем случае mktime()
не всегда может определить это автоматически.
Явный статус DST (0 или 1) должен исходить от чего-то внешнего по отношению к программному обеспечению, например, хранить его в файле или базе данных или запрашивать у пользователя.
person
Rich Jahn
schedule
24.08.2012