如何将带时区缩写的字符串转换为日期时间对象?
我在尝试把一个字符串转换成日期时间对象。
我从新闻源得到的字符串格式是这样的:
Thu, 16 Oct 2014 01:16:17 EDT"
我试着用 datetime.strptime()
来转换它。
也就是说,
datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')
结果出现了以下错误:
错误追踪(最近的调用在最前面):
文件 "", 第 1 行,
datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')
文件 "C:\Anaconda\lib_strptime.py", 第 325 行,在 _strptime
(data_string, format)
值错误:时间数据 'Thu, 16 Oct 2014 01:16:17 EDT' 与格式 '%a, %d %b %Y %H:%M:%S %Z' 不匹配
不过,如果我去掉 "EDT" 的话,就能成功转换。
也就是说,
datetime.strptime('Thu, 16 Oct 2014 01:16:17','%a, %d %b %Y %H:%M:%S')
有没有人知道怎么处理这个 "EDT" 部分呢?
2 个回答
email.utils.parsedate_tz() 这个方法适合处理三字母的时区,比如 EST 或 GMT,但对于四字母的时区,比如 AEDT 或 CEST 就不太管用了。如果你需要同时处理这两种情况,可以参考这个链接下的答案:Parsing date/time string with timezone abbreviated name in Python?,这个方法可以处理大多数常用的时区。
要解析符合 RFC 2822格式的日期,你可以使用 email
这个包:
from datetime import datetime, timedelta
from email.utils import parsedate_tz, mktime_tz
timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT"))
# -> 1413436577
utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp)
# -> datetime.datetime(2014, 10, 16, 5, 16, 17)
注意:parsedate_tz()
假设 EDT 对应的是 -0400
的 UTC 时区偏移,但在澳大利亚可能不对,因为那里 EDT 是 +1100
(在这种情况下,pytz
使用的是 AEDT),也就是说,时区缩写可能会有歧义。你可以查看 用时区缩写解析日期/时间字符串在 Python 中的实现?
相关的 Python 错误:%Z 在 strptime 中与 EST 等不匹配。
如果你的电脑使用的是 POSIX 时间戳(很可能是),并且你确定输入的日期在你的系统可以接受的范围内(不会太远的未来或过去),而且你不需要保留微秒的精度,那么你可以使用 datetime.utcfromtimestamp
:
from datetime import datetime
from email.utils import parsedate_tz, mktime_tz
timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT"))
# -> 1413436577
utc_dt = datetime.utcfromtimestamp(timestamp)
# -> datetime.datetime(2014, 10, 16, 5, 16, 17)