2011-12-19 2 views
11

Я видел много разных взглядов, поэтому подумал о том, чтобы спросить здесь.mktime и tm_isdst

Я прочитал man mktime:

(A positive or zero value for tm_isdst causes mktime() to presume initially 
that summer time (for example, Daylight Saving Time) is or is not in 
effect for the specified time, respectively. A negative value for 
tm_isdst causes the mktime() function to attempt to divine whether summer 
time is in effect for the specified time. 

Мой вопрос, не должен tm_isdst храниться в -1, чтобы позволить системе решить, если его ДСТ или нет, и таким образом код становится ДСТ агностик?

Я что-то упустил?

ответ

5

Я считаю, что первоначальная причина для этого - некоторые часовые пояса не имеют летнего времени. Поскольку mktime не является безопасным для асинхронности, и он не позволяет повторному вводу реализовать текущее значение экономии дневного света в элементе POSIX extern char tzname [2], индексируется по дневному свету [0 или 1]. Это означает, что tzname [0] = "[std TZ name]" и tzname = "[название дневного света TZ, например EDT]"

Дополнительную информацию об этом можно найти на странице пользователя tzset(). Стандарты, соответствующие mktime(), должны вести себя так, как если бы они назывались tzset() в любом случае. Этот вид исключает использование tm_isdst, IMO.

Нижняя строка: ваша конкретная реализация и часовой пояс (ы) будут определять, будете ли вы использовать -1, 0 или 1 для tm_isdst. Для всех реализаций нет правильного пути по умолчанию.

7

Вам следует избегать установки 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(&timestr); 

    /* now with daylight time */ 
    timestr.tm_isdst = 1; 
    daylight = mktime(&timestr); 

    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) должен исходить из чего-то внешнего программного обеспечения, например хранить его в файле или базе данных или запрашивать пользователя.

+2

Ну, если вы не знаете DST, вам нужно определить его самостоятельно (удачи с этим) или установить его в '-1'. Другого варианта нет. Если вы установите его на 0, вы не получите никакого DST на всех, что гарантировано неправильно, если вы установите его на 1, вы заставляете DST, на котором также гарантировано неправильное. – rustyx

+0

@RustyX Жесткое кодирование до -1, 0 или 1 всегда будет ошибочным. -1 - это наименее плохо, но все равно плохо. Явный статус (0 или 1) должен быть _input_ для программного обеспечения от пользователя или сохранен в данных (файле или базе данных). В основном это должно происходить из чего-то внешнего приложения. –

+0

v хороший ответ. Спасибо – drlolly

Смежные вопросы