Python 将字符串转换为datetime对象

Python 将字符串转换为datetime对象,python,datetime,rfc2822,Python,Datetime,Rfc2822,我试图将字符串转换为datetime对象。 我从新闻源获取的字符串的格式如下: 2014年10月16日星期四美国东部时间01:16:17 我尝试使用datetime.strtime转换它。 i、 e 并得到以下错误: 回溯最近一次呼叫上次: 文件,第1行,在 datetime.strTime'Thu,2014年10月16日01:16:17美国东部时间',“%a,%d%b%Y%H:%M:%S%Z” 文件C:\Anaconda\lib_strtime.py,第325行,在_strtime中 数据字符

我试图将字符串转换为datetime对象。 我从新闻源获取的字符串的格式如下: 2014年10月16日星期四美国东部时间01:16:17

我尝试使用datetime.strtime转换它。 i、 e

并得到以下错误:

回溯最近一次呼叫上次: 文件,第1行,在 datetime.strTime'Thu,2014年10月16日01:16:17美国东部时间',“%a,%d%b%Y%H:%M:%S%Z” 文件C:\Anaconda\lib_strtime.py,第325行,在_strtime中 数据字符串,格式 ValueError:时间数据“2014年10月16日星期四01:16:17 EDT”不匹配 格式“%a,%d%b%Y%H:%M:%S%Z”

但是,如果我在没有EDT的情况下尝试使用字符串,它会起作用。 i、 e

有人知道如何解析EDT部分吗?

要解析中的日期,可以使用电子邮件包:

注:parsedate_tz假设EDT对应于-0400 UTC偏移量,但在澳大利亚可能不正确,因为在这种情况下,pytz使用EDT为+1100 AEDT,即时区缩写可能不明确。看

相关Python错误:

如果您的计算机可能使用POSIX时间戳,并且您确信输入日期在系统可接受的范围内(距离未来/过去不远),并且您不需要保持微秒精度,那么您可以使用:


email.utils.parsedate_tz解决方案适用于3个字母的时区,但不适用于4个字母,如AEDT或CEST。如果您需要混合答案,则下面的答案适用于最常用的时区。

related:@user2629723相关:@user2629723如果答案有助于解决您的问题,请通过选中旁边的复选标记进行指示。这样做表明你的问题已经解决,同时也为你和回答者赢得了声誉。有关更多信息,请参阅。从python3.3开始,您可以使用它,因此无需添加偏移量来增加一点easier@amohr1-utcfromtimestamp在Python3.3 2-datetime+timedelta可能具有更可移植的日期范围之前就一直可用,它显式地显示了POSIX时间戳和UTC时间之间的关系。虽然在大多数情况下,这两种方法都是可互换的,并且utcfromtimestamp的使用具有较少的活动部件,因此更可取。@amohr,datetime.utcfromtimestamp在2.7中提供。它只是在3.3中稍微改变了行为。感谢@jfs的警告!
datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')
datetime.strptime('Thu, 16 Oct 2014 01:16:17','%a, %d %b %Y %H:%M:%S')
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)
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)