Python datetime 打印带时区和夏令时
我在使用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>)