将字符串转换为日期时间对象

7 浏览
0 Comments

将字符串转换为日期时间对象

我试图将一个字符串转换为一个日期时间对象。

我从一个新闻源获得的字符串格式如下:

\"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”部分吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

email.utils.parsedate_tz()方法适用于3字母时区,但无法解决AEDT或CEST等4字母时区。如果您需要混合使用,可以在Python中解析带有时区缩写名的日期/时间字符串下找到适用于大多数常用时区的解决方案。

0
0 Comments

要解析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)

0