我是 Python 新手,我有一个处理
datetime
的用例。不幸的是,数据不是 UTC,所以我必须依赖当地时间、时区和夏令时。我尝试使用 datetime
和 pytz
从 datetime
获取纪元值,但它不起作用。
方法 1:如果我尝试创建
datetime
对象,将其本地化为布鲁塞尔时间并使用 strftime 转换为纪元,我将得到夏令时 (DST) 之外的窗口的有效响应。但在夏令时期间,我收到的回复为 -1
。
方法 2:如果我在创建
datetime
对象时给出时区详细信息,并尝试将其转换为纪元,则其给出的值与 IST 的值相同。
from datetime import datetime
import pytz
print('localize')
print(pytz.timezone("Asia/Kolkata").localize(datetime(2024, 10, 27, 0,0,0)).strftime('%s'))
print(pytz.timezone("Europe/Brussels").localize(datetime(2024, 10, 27, 0,0,0)).strftime('%s'))
print(pytz.timezone("Europe/Brussels").localize(datetime(2024, 10, 27, 6,0,0)).strftime('%s'))
print('tzinfo')
print(datetime(2024, 10, 27, 0,0,0, tzinfo=pytz.timezone("Asia/Kolkata")).strftime('%s'))
print(datetime(2024, 10, 27, 0,0,0,tzinfo=pytz.timezone("Europe/Brussels")).strftime('%s'))
print(datetime(2024, 10, 27, 6,0,0, tzinfo=pytz.timezone("Europe/Brussels")).strftime('%s'))
输出:
localize
1729967400
-1
1729989000
tzinfo
1729967400
1729967400
1729989000
更令人困惑的是,如果我打印没有格式化的日期时间值,方法 1 显示有效信息,而方法 2 显示非舍入偏移值,如下所示。
print('datetime values showing appropriate offset')
print(pytz.timezone("Asia/Kolkata").localize(datetime(2024, 10, 27, 0, 0, 0)))
print(pytz.timezone("Europe/Brussels").localize(datetime(2024, 10, 27, 0, 0, 0)))
print(pytz.timezone("Europe/Brussels").localize(datetime(2024, 10, 27, 6, 0, 0)))
print('datetime values showing different offset')
print(datetime(2024, 10, 27, 0,0,0, tzinfo=pytz.timezone("Asia/Kolkata")))
print(datetime(2024, 10, 27, 0,0,0,tzinfo=pytz.timezone("Europe/Brussels")))
print(datetime(2024, 10, 27, 6,0,0, tzinfo=pytz.timezone("Europe/Brussels")))
输出:
datetime values showing appropriate offset
2024-10-27 00:00:00+05:30
2024-10-27 00:00:00+02:00
2024-10-27 06:00:00+01:00
datetime values showing different offset
2024-10-27 00:00:00+05:53
2024-10-27 00:00:00+00:18
2024-10-27 06:00:00+00:18
哪个更好,为什么这样?不确定我是否遗漏了什么。有人可以帮忙吗?
使用内置的
zoneinfo
(从Python 3.9开始可用)和.timestamp()
代替Windows不支持的%s
的非标准.strftime
,一切都有效:
import datetime as dt
import zoneinfo as zi
print(dt.datetime(2024, 10, 27, tzinfo=zi.ZoneInfo('Asia/Kolkata')).timestamp())
print(dt.datetime(2024, 10, 27, tzinfo=zi.ZoneInfo('Europe/Brussels')).timestamp())
print(dt.datetime(2024, 10, 27, 6, tzinfo=zi.ZoneInfo('Europe/Brussels')).timestamp())
print(dt.datetime(2024, 10, 27, tzinfo=zi.ZoneInfo('Asia/Kolkata')))
print(dt.datetime(2024, 10, 27, tzinfo=zi.ZoneInfo('Europe/Brussels')))
print(dt.datetime(2024, 10, 27, 6, tzinfo=zi.ZoneInfo('Europe/Brussels')))
输出:
1729967400.0
1729980000.0
1730005200.0
2024-10-27 00:00:00+05:30
2024-10-27 00:00:00+02:00
2024-10-27 06:00:00+01:00