【问题标题】:datetime: conversion from string with timezone name not workingdatetime:从带有时区名称的字符串转换不起作用
【发布时间】:2017-06-19 09:23:14
【问题描述】:

我有以下字符串 "2017-03-30 08:25:00CET",我想将其转换为 datetime tz-aware 对象。

根据this SO question,从python 3.2 可以只使用datetime 模块来完成。另外,从documentation,我看到了

%z |  UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). |  (empty), +0000, -0400, +1030
%Z |  Time zone name (empty string if the object is naive).                        |  (empty), UTC, EST, CST

所以我尝试以下方法

datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%Z')

我没有收到任何错误,但是我得到的对象不是 tz-aware

datetime.datetime(2017, 3, 30, 8, 25)

另一方面,如果我将我的字符串转换为"2017-03-30 08:25:00+0200",然后使用

将其转换为对象

datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%z')

我确实得到了一个 tz 感知日期时间:

datetime.datetime(2017, 3, 30, 8, 25, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

任何想法为什么它适用于%z 但不适用于%Z?我做错了什么?

【问题讨论】:

  • 与您相关的:stackoverflow.com/questions/1703546/…stackoverflow.com/questions/3305413/…。时区名称(例如 cet)不明确。您的第二个示例有效,因为您专门提供了时区偏移量+0200。在 dateutil 中使用解析器,或使用 tzinfo() 手动指定您的时区。
  • 使用 Python 3.6,我通过执行 datetime.strptime("2017-03-30 08:25:00CET", '%Y-%m-%d %H:%M:%S%Z') 得到一个 ValueError: time data '2017-03-30 08:25:00CET' does not match format '%Y-%m-%d %H:%M:%S%Z',这与您所说的不同。
  • @CharlesMorris,感谢您的链接。我发现第二个特别有趣。对我来说,在文档中给出使用时区名称的可能性是没有意义的,但是它不起作用,因为它是模棱两可的。
  • 这是这里描述的一个已知错误:bugs.python.org/issue22377

标签: python python-3.x timezone python-datetime


【解决方案1】:

从tzinfo 提供的信息来看,%Z 的工作方式与您输入"UTC" 之类的字符串的方式不同,它将返回具有正确时区的日期时间实例。

pytz 为您的问题提供了可能的解决方案。但是,文档说,不能保证您的时区将被 datetime 识别,并建议尽可能长时间地使用 UTC。

使用pytz的解决方案:

from datetime import datetime
from pytz import timezone
dep_dt = '2017-03-30 08:25:00CET'
dt = datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%Z')
timezone(dep_dt[19:]).localize(dt)

输出:

datetime.datetime(2017, 3, 30, 8, 25, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>)

【讨论】:

  • 这是否意味着来自datetime 的文档是错误的?
  • 至少不是很清楚。有一个解释该行为的注释,但这在我的观点中也不清楚:“%Z 如果 tzname() 返回 None,则 %Z 将替换为空字符串。否则 %Z 将替换为返回值,即必须是字符串。在 3.2 版更改:当 %z 指令提供给 strptime() 方法时,将生成一个感知的日期时间对象。结果的 tzinfo 将设置为时区实例"
  • 我现在添加了一个使用 pytz 的解决方案。
  • 如果我在 Python 3.8.5 上运行您的代码,我会收到 ValueError: time data '2017-03-30 08:25:00CET' does not match format '%Y-%m-%d %H:%M:%S%Z'。我记得与早期版本相比有所变化..
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2021-10-08
  • 2012-05-22
  • 2019-05-07
  • 2016-11-20
相关资源
最近更新 更多