Вам следует избегать установки tm_isdst на -1, если это возможно. Система не всегда может определять статус DST только по дате и времени. Это неоднозначно за час до и после окончания летнего времени. Например, если вы пройдете mktime()
1:30 AM 4 ноября 2012 года, этого недостаточно, чтобы получить правильное значение time_t
от mktime()
. Обычно я видел mktime()
предполагаемое стандартное время в случае, если оно неоднозначно, но я не видел никакой документации, гарантирующей такое поведение на всех платформах. 1:30 AM 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 до 59, и соответственно будут отрегулированы значения tm_day
, tm_mday
и т. Д. tm_isdst
- также вход и выход. Его значения заключаются в следующем:
- 1 (ДСТ в сущности, т.е. летнему времени)
- 0 (DST не действует, т.е.стандартное время)
- -1 (Неизвестный статус DST)
Так указываете ей() будет выводить либо 1 или 0 для tm_isdst, никогда -1.
-1 возможно ввод, но я бы подумал об этом как о значении «Неизвестный». Не думайте об этом как о значении «автоматически определяйте», потому что в целом mktime()
не всегда может определить его автоматически.
Явный статус DST (0 или 1) должен исходить из чего-то внешнего программного обеспечения, например хранить его в файле или базе данных или запрашивать пользователя.
Ну, если вы не знаете DST, вам нужно определить его самостоятельно (удачи с этим) или установить его в '-1'. Другого варианта нет. Если вы установите его на 0, вы не получите никакого DST на всех, что гарантировано неправильно, если вы установите его на 1, вы заставляете DST, на котором также гарантировано неправильное. – rustyx
@RustyX Жесткое кодирование до -1, 0 или 1 всегда будет ошибочным. -1 - это наименее плохо, но все равно плохо. Явный статус (0 или 1) должен быть _input_ для программного обеспечения от пользователя или сохранен в данных (файле или базе данных). В основном это должно происходить из чего-то внешнего приложения. –
v хороший ответ. Спасибо – drlolly