Вопрос

Функция mktime принимает struct tm как аргумент. Один из членов struct tm является tm_isdst. Анкет Вы можете установить это на 1 для зимы, 0 для летнего или -1, если не знаете.

Однако, если зимой вы пытаетесь преобразовать 2009-09-01 00:00, mktime Невозможно видеть, что, хотя в настоящее время это зима, дата, которую вы преобразуете летнее время. Таким образом, результат - один час. Для меня (GMT+1) это 2009-08-31 22:00, пока это должно быть 23:00.

Есть ли способ определить, является ли конкретная дата летом или зимним периодом? Можно ли преобразовать летнюю дату в UTC зимой?

(Я столкнулся с этой проблемой, пытаясь ответить этот вопрос)

Это было полезно?

Решение

Это один из (многих) недостатки в время умение обращаться интерфейсы В Стандарте C. См. Также Олсон База данных часового пояса. Например, нет простого способа найти, когда часовой пояс переключается между зимним и летним (дневным светом и стандартным). Все в будущем, конечно, предсказание - наборы правил часто меняются (текущий выпуск 2017a).

Есть ли, насколько вы знаете, решение UNIX?

Я посмотрел на код в tzcode2017a.tar.gz и mktime() Там ведет себя так, как вы хотите, если вы установите TM_ISDST -1 (неизвестно). Итак, если вы используете этот код (общедоступный), вы бы в порядке - вероятно. Цитируя из «localtime (3)», распределенное с кодом Olson:

MKTime преобразует время разбитого вниз, выражаемое как локальное время, в структуре, на которую указывается TM в календарное время времени с тем же кодированием, что и значения, возвращаемые к функции времени. Исходные значения tm_wday а также tm_yday Компоненты структуры игнорируются, а исходные значения других компонентов не ограничены их нормальными диапазонами. (Положительное или нулевое значение для tm_isdst причины mktime Первоначально предположить, что летнее время (например, время сэкономить летнее время в США) соответственно, является или не действует в течение указанного времени. Отрицательное значение для tm_isdst вызывает mktime функция, чтобы попытаться божественно, действует ли летнее время в течение указанного времени; В этом случае он не использует согласованное правило и может дать другой ответ, когда позже будет представлен один и тот же аргумент.)

Я полагаю, что последнее предостережение о «последовательном правиле» означает, что если спецификация изменений часового пояса (например, как, например, когда США изменились с 1 -й недели на 2 -й недели марта для перехода на время сэкопленного света) Что если вы определите некоторое время до изменения правила и после изменения правила, одни и те же входные данные дадут разные выходы.

(Обратите внимание, что есть полезные HTML -файлы в ftp://ftp.iana.org/tz/ каталог, такой как ftp://ftp.iana.org/tz/tz-link.html.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top