如何在Python中获取任何给定的带有时区和夏令时的本地时间的纪元值?

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

我是 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

哪个更好,为什么这样?不确定我是否遗漏了什么。有人可以帮忙吗?

python datetime timezone dst pytz
1个回答
0
投票

使用内置的

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
© www.soinside.com 2019 - 2024. All rights reserved.