关于c ++:std :: localtime一秒钟导致30分钟的差距

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不是真正的时区


考虑到time_t给出的时间正好是进入新的一小时前的一秒钟,这几乎肯定与夏令时或其他一些调整有关。

加上一点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.

事实上,这种情况经常发生,世界各地的国家都不愿意把当地的时间随意地转移到各地。