具有非常旧日期的当地时间

localtime with very old dates

一直在折腾time.h,遇到了下面的怪事。

time_t t;
struct tm loc, utc;
t = -11676066452; /* This time is mostly arbitrary. */
loc = *localtime(&t);
utc = *gmtime(&t);
printf("localtime: %s", asctime(&loc));
printf("gmtime:    %s", asctime(&utc));

输出为

 localtime: Sat Jan  1 00:00:00 1600
 gmtime:    Sat Jan  1 08:12:28 1600

因此,显然,当时本地与 UTC 的绝对偏移量为 8 小时 12 分 28 秒。所选日期甚至早于时区建立,那么 localtime 如何确定此偏移量?

我的时区是 America/Vancouver(太平洋夏令时,或当前为 -7 小时的 UTC 偏移)并且我使用的是 glibc 2.27。

您只是在观察 LMT 的偏移量 (Local Mean Time) entry for America/Vancouver from the IANA TZ Database.

# Zone    NAME               STDOFF    RULES    FORMAT  [UNTIL]
Zone      America/Vancouver  -8:12:28  -        LMT     1884
                             -8:00     Vanc     P%sT    1987
                             -8:00     Canada   P%sT

此处来源:https://github.com/eggert/tz/blob/2020a/northamerica#L2134

您可以在 tz 数据库的 theory 文件中阅读有关 LMT(以及更多)的更多信息。