std::localtime 一秒钟导致 30 分钟的差距

std::localtime one second leads to 30 mins gap

#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, month:3, day:26, hour:23, min:59, sec:59

当地时间 => 年:98, month:3, day:27, hour:0, min:30, sec:0

这是怎么回事?为什么 1 秒会导致 30 分钟的差距??

鉴于给定的 time_t 恰好是进入新小时之前的一秒,这几乎可以肯定与夏令时或其他一些调整有关。

而且,加上一点 Google-fu,here 是:

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.

这实际上经常发生,世界上许多国家都在随意改变他们的当地时间:-)

正如另一个答案所提到的,当地时间一直在变化,夏令时等等。

要 "portably" 表示一个瞬间变得几乎不可能,因此发明了 UTC,这是一个神奇的时区*,它是表示时间的标准方式,仅考虑闰秒。

正确处理所有这些情况非常乏味,但幸运的是 Howard Hinnant this amazing library 可以为您做所有事情:)

* UTC 并不是真正的时区