std::localtime одна секунда приводит к 30-минутному разрыву

#include <iostream>
int main(){
    std::time_t t = 893665799;
    std::tm * tm = std::localtime(&t);
    printf("local time duration =>year:%d, month:%d, day:%d, hour:%d, min:%d, sec:%d\n",tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);

    t = 893665800;
    tm = std::localtime(&t);
    printf("local time duration =>year:%d, month:%d, day:%d, hour:%d, min:%d, sec:%d\n",tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
}

893665799 — это волшебный utc.

Когда вы меняете часовой пояс на острова Питкэрн.

Журнал показан ниже

Продолжительность по местному времени => год: 98, месяц: 3, день: 26, час: 23, мин: 59, сек: 59

Продолжительность по местному времени => год: 98, месяц: 3, день: 27, час: 0, мин: 30, сек: 0

в чем дело ? почему 1 сек приводит к 30 минутному разрыву??


person mouse    schedule 26.05.2017    source источник
comment
Вы изменили свой часовой пояс на острова Питкэрн?   -  person mouse    schedule 26.05.2017


Ответы (2)


Учитывая, что time_t задано ровно за одну секунду до перехода в новый час, это почти наверняка связано с переходом на летнее время или какой-либо другой корректировкой.

И, немного погуглив, здесь это является:

27 апреля 1998 г. – изменение часового пояса (PNT → PST)

Когда местное стандартное время приближалось к понедельнику, 27 апреля 1998 г., 12:00:00, полуночные часы были переведены на 0:30 вперед до понедельника, 27 апреля 1998 г., 00:30:00 по местному стандартному времени.

На самом деле это происходит довольно часто, когда разные страны по всему миру волей-неволей меняют свое местное время :-)

person paxdiablo    schedule 26.05.2017

Как упоминалось в другом ответе, местное время постоянно меняется, что касается перехода на летнее время и многого другого.

«Портативное» представление одного момента времени стало почти невозможным, и поэтому был изобретен UTC, который представляет собой волшебный часовой пояс *, который является стандартным способом представления времени, только с учетом високосных секунд.

Правильно обрабатывать все эти случаи невероятно утомительно, но, к счастью, у Говарда Хиннанта есть эта замечательная библиотека, которая делает все для ты :)

* UTC на самом деле не является часовым поясом

person Passer By    schedule 26.05.2017