Python datetime 打印带时区和夏令时

0 投票
2 回答
512 浏览
提问于 2025-04-18 01:43

我在使用Python和时区方面遇到了问题。

我有一个这样的日期字符串:

2014-04-08T01:00:00+02:00

我用dateutil.parse把它解析成一个日期时间对象:

my_date = parser.parse(str(json)).replace(tzinfo=dateutil.tz.gettz('CET'))

这样我得到了一个日期时间对象:

2014-04-08 01:00:00+02:00 with tzinfo = "Europe/Berlin" and _dst = 1:00:00

现在我想用以下方式打印一个本地化的日期格式:

my_date.strftime("%Y-%m-%d %H:%M:%S")

但不幸的是,它返回的是:

'2014-04-08 01:00:00'

而实际上应该是:

'2014-04-08 00:00:00' in daylight saving time

有没有什么办法可以得到正确的日期呢?

2 个回答

0

显然,在时区和夏令时的处理上,

my_date.replace(tzinfo=pytz.timezone('Europe/Berlin'))

my_date.astimezone(pytz.timezone('Europe/Berlin'))

是有区别的。使用.replace方法时,它不会考虑夏令时的变化,而使用.astimezone方法时,它会考虑这些变化。

0

2014-04-07 23:00:00 UTC欧洲/柏林 时区对应的是 2014-04-08 01:00:00

#!/usr/bin/env python
import pytz
from dateutil.parser import parse

s = '2014-04-08T01:00:00+02:00'
tz = pytz.timezone("Europe/Berlin")
dt = tz.normalize(parse(s).astimezone(tz))
print(dt.strftime("%Y-%m-%d %H:%M:%S %Z%z"))
# -> 2014-04-08 01:00:00 CEST+0200

2014-04-08 00:00:00欧洲/柏林 时区对应的是 2014-04-07 22:00:00 UTC

>>> tz.localize(parse('2014-04-08 00:00:00'), is_dst=None).astimezone(pytz.utc)
datetime.datetime(2014, 4, 7, 22, 0, tzinfo=<UTC>)

撰写回答