【问题标题】:Correctly parse date string with timezone information使用时区信息正确解析日期字符串
【发布时间】:2012-06-10 10:55:36
【问题描述】:

我通过关键跟踪器 API 接收到这样的格式化日期字符串:“2012/06/05 17:42:29 CEST”

我想将此字符串转换为 UTC 日期时间对象,看起来 python-dateutil 无法识别该时区,pytz 也不知道。

我担心我最好的选择是将字符串中的 CEST 替换为 CET,但这感觉非常错误。有没有其他方法可以将夏令时字符串解析为我找不到的 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 是否适用于给定的输入并正确解析它,我希望。

标签: python datetime timezone datetime-parsing


【解决方案1】:

没有真正的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 为我创建了一个幼稚的日期时间对象:ValueError: astimezone() cannot be applied to a naive datetime
  • @Strayer - 如果你知道你只处理 CET/CEST,你可以.replace('CEST', '+02:00').replace('CET', '+01:00') 之前。
  • 是的,这就是我现在正在做的事情。我只能希望 Pivotal 的 API 永远不会决定做其他事情或有人决定更改 Pivotal API 用户的时区设置。
猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 2017-06-22
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多