为什么使用 pytz 进行的这些日期时间转换不能在 1901 年 12 月之前的几个小时内实现?

问题描述 投票:0回答:1

也许我没有正确使用这些库,或者也许 1901 年 12 月 15 日发生了某种关于全球计时的标准变化。但我在开发与时间相关的应用程序时偶然发现了这种奇怪的行为。

sydney = pytz.timezone("Australia/Sydney")
tokyo = pytz.timezone("Japan")
new_york = pytz.timezone("US/Eastern")

dt1 = datetime(1901, 12, 14)
dt2 = datetime(1901, 12, 15)

print("-" * 50)
print(sydney.localize(dt1).astimezone(pytz.UTC))
print(tokyo.localize(dt1).astimezone(pytz.UTC))
print(new_york.localize(dt1).astimezone(pytz.UTC))
print("-" * 50)
print(sydney.localize(dt2).astimezone(pytz.UTC))
print(tokyo.localize(dt2).astimezone(pytz.UTC))
print(new_york.localize(dt2).astimezone(pytz.UTC))
print("-" * 50)

我希望这段代码能够告诉我这些不同时区午夜时间的 UTC 等效时间。我发现奇怪的是,对于 1901 年 12 月之前的较旧日期时间,结果甚至没有落在小时上,而是包含了微小的组成部分。 1901 年 12 月之后,似乎每次皈依都按时进行。这是上面代码的输出:

--------------------------------------------------
1901-12-13 13:55:00+00:00
1901-12-13 14:41:00+00:00
1901-12-14 05:00:00+00:00
--------------------------------------------------
1901-12-14 14:00:00+00:00
1901-12-14 15:00:00+00:00
1901-12-15 05:00:00+00:00
--------------------------------------------------

想知道我是否使用了可靠的技术,或者由于某些历史/政治原因这实际上是否正确?

python datetime pytz
1个回答
0
投票

这似乎与2038年问题有关,尽管我不确定具体如何。 1901-12-13 20:45:52 UTC 比 Unix 纪元早

2**31
秒,如果我们看看伦敦的那个时间,会比 Unix 纪元早一分钟。

import pytz
from datetime import datetime, timedelta

london = pytz.timezone("Europe/London")

dt0 = datetime(1901, 12, 13, 20, 45, 52)
second = timedelta(seconds=1)
for d in dt0-second, dt0, dt0+second:
    c = london.localize(d).astimezone(pytz.UTC)
    print(d, "|", c.time())
1901-12-13 20:45:51 | 20:46:51
1901-12-13 20:45:52 | 20:45:52
1901-12-13 20:45:53 | 20:45:53
© www.soinside.com 2019 - 2024. All rights reserved.