Почему localtime () устанавливает флаг tm_isdst на 1 час, когда заканчивается летнее время и время возвращается на один час

У меня настроена система в Московском часовом поясе. Москва переходит на летнее время в последнее воскресенье марта каждого года. Московское летнее время (МСД) - UTC +4 часа. В последнее воскресенье октября переход на летнее время заканчивается, и он возвращается к стандартному московскому времени (МСК), которое составляет UTC +3 часа.

Переход с MSD на MSK происходит в последнее воскресенье октября в 3 часа ночи. К 3 часам ночи часы снова сбрасываются на 2 часа ночи. Итак, в последнее воскресенье октября будет два часа ночи. В первый раз в 2 часа ночи Москва еще в МСД (UTC +4). На втором экземпляре в 2 часа ночи Москва уже в МСК (UTC +3).

Мой вопрос: если я использую функцию localtime () для получения информации о местном часовом поясе во втором экземпляре 2 часов ночи в последнее воскресенье октября, будет ли флаг tm_isdst установлен с помощью localtime () или он не будет установлен. По моим наблюдениям, флаг tm_isdst устанавливается функцией localtime () в течение часового окна с 2 до 3 часов ночи (второй экземпляр) в MSK. Это ошибка или это ожидаемое поведение?

Что касается записей, мой файл базы данных timezone / Europe tz обновлен, а соответствующий файл базы данных часового пояса правильно скомпилирован компилятором zic как / usr / share / zoneinfo / Europe / Moscow.


person Sridhar Bhaskaran    schedule 17.02.2011    source источник


Ответы (1)


Из небольшого исследования спецификаций, похоже, что C определяет всю эту информацию из переменных среды. В этом случае для POSIX указана переменная среды TZ. Windows хранит его в реестре. В течение этого 1-часового периода вы явно больше не находитесь в режиме летнего времени, поэтому по определению флага tm_isdst это должно быть ясно.

Чтобы узнать, является ли это ошибкой в ​​реализации компилятора / библиотеки или ОС, вам нужно будет проверить значение переменной среды непосредственно в течение этого периода.

person caveman    schedule 17.02.2011