将字符串转换为日期时间对象
将字符串转换为日期时间对象
我试图将一个字符串转换为一个日期时间对象。
我从一个新闻源获得的字符串格式如下:
\"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')
然后我得到以下错误:
Traceback (most recent call last):
File \"\", line 1, in
datetime.strptime(\'Thu, 16 Oct 2014 01:16:17 EDT\',\'%a, %d %b %Y %H:%M:%S %Z\')
File \"C:\\Anaconda\\lib_strptime.py\", line 325, in _strptime
(data_string, format))
ValueError: time data \'Thu, 16 Oct 2014 01:16:17 EDT\' does not match
format \'%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”部分吗?
email.utils.parsedate_tz()方法适用于3字母时区,但无法解决AEDT或CEST等4字母时区。如果您需要混合使用,可以在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)