正确解析带有时区信息的日期字符串。

8

通过Pivotal Tracker API接收到的格式化日期字符串为:"2012/06/05 17:42:29 CEST"

我想将此字符串转换为UTC日期时间对象,但是python-dateutil似乎无法识别这个时区,pytz也不知道它。

我担心最好的办法是用CET替换字符串中的CEST,但这感觉很不正确。是否还有其他方法可以将夏令时字符串解析为UTC日期时间对象?

pytz.timezone('CEST')
# -> pytz.exceptions.UnknownTimeZoneError: 'CEST'
dateutil.parser.parse("2012/06/05 17:42:29 CEST")
# -> datetime.datetime(2012, 6, 5, 17, 42, 29)

编辑:思考再次,减去一个小时完全是错误的,因为相应的时区目前也处于夏令时,解析问题仍然存在。


我不确定夏令时(DST)在日期时间计算的目的上算作一个独立的时区。日期时间库应该能够确定给定输入是否适用于DST并正确解析它,我希望如此。 - millimoose
1个回答

10

CEST并不是一个真正的时区。根据您所在地区,请使用Europe/ParisEurope/BerlinEurope/Prague(或其他时区):

>>> pytz.country_timezones('de')
[u'Europe/Berlin']

>>> pytz.country_timezones('fr')
[u'Europe/Paris']

它们(目前)是相同的,都指向夏季的CEST

>>> dateutil.parser.parse("2012/06/05 17:42:29 CEST").astimezone(pytz.utc)
datetime.datetime(2012, 6, 5, 15, 42, 29, tzinfo=<UTC>)

问题在于dateutil为我创建了一个naive datetime对象:ValueError: astimezone()无法应用于naive datetime。 - Strayer
2
@Strayer - 如果你知道你只处理CET/CEST,那么你可以在之前使用.replace('CEST', '+02:00').replace('CET', '+01:00') - eumiro
是的,这就是我现在正在做的事情。我只能希望Pivotal API的API决不会做出其他行动或者有人决定更改Pivotal API用户的时区设置。 - Strayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接