Конвертируйте летнюю дату в UTC зимой?
Вопрос
Функция 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.)