std::localtime one second leads to 30 mins gap
1 2 3 4 5 6 7 8 9 10 11 12 | #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 ",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 ",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分钟的间隔??
正如另一个答案所提到的,当地时间总是在变化,什么是夏时制,什么是不。
要"可移植"地表示时间中的一个瞬间几乎是不可能的,因此发明了UTC,它是一个神奇的时区*这是表示时间的标准方法,只考虑闰秒。
正确处理所有这些案例是极其乏味的,但谢天谢地,霍华德·辛南特有一个神奇的图书馆,它为你做了一切:)
>*UTC不是真正的时区
考虑到
加上一点google fu,这里是:
27 Apr 1998 - Time Zone Change (PNT → PST)
When local standard time was about to reach Monday, 27 April 1998, 12:00:00, midnight clocks were turned forward 0:30 hours to Monday, 27 April 1998, 12:30:00 am local standard time instead.
事实上,这种情况经常发生,世界各地的国家都不愿意把当地的时间随意地转移到各地。