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

Posted

技术标签:

【中文标题】将字符串转换为日期时间对象【英文标题】:Converting string to datetime object 【发布时间】:2014-12-13 15:46:51 【问题描述】:

我试图。 我从新闻提要中得到的字符串格式如下: “美国东部时间 2014 年 10 月 16 日星期四 01:16:17”

我尝试使用 datetime.strptime() 来转换它。 即,

datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')

并得到以下错误:

回溯(最近一次通话最后一次): 文件“”,第 1 行,在 datetime.strptime('星期四,2014 年 10 月 16 日 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z') _strptime 中的文件“C:\Anaconda\lib_strptime.py”,第 325 行 (数据字符串,格式)) ValueError:时间数据“2014 年 10 月 16 日星期四 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”部分吗?

【问题讨论】:

相关:Python: parsing date with timezone from an email. 相关:How do I parse an HTTP date-string in Python? 【参考方案1】:

email.utils.parsedate_tz() 解决方案适用于 3 个字母的时区,但不适用于 4 个字母的时区,例如 AEDT 或 CEST。如果您需要混合,Parsing date/time string with timezone abbreviated name in Python? 下的答案适用于最常用的时区。

【讨论】:

【参考方案2】:

要解析RFC 2822 format 中的日期,您可以使用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)即,时区缩写可能是模糊的。见Parsing date/time string with timezone abbreviated name in Python?

相关 Python 错误:%Z in strptime doesn't match EST and others.

如果您的计算机(可能)使用 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)

【讨论】:

@user2629723 如果答案有助于解决您的问题,请通过选中它旁边的复选标记来表明这一点。这样做表明您的问题已得到解决,并且还为您和回答者赢得了声誉。有关详细信息,请参阅“How does accepting an answer work?”。 从python3.3开始你可以使用docs.python.org/3.6/library/…所以你不需要添加偏移量来让它更容易一点 @amohr 1- utcfromtimestamp() 永远可用(早在 Python 3.3 之前) 2- datetime + timedelta 可能具有更便携的日期范围,它明确显示了 POSIX 时间戳和 UTC 时间之间的关系。尽管在大多数情况下,这两种方法都是可以互换的,并且 utcfromtimestamp() 的使用具有较少的移动部分(因此更可取)。 @amohr,datetime.utcfromtimestamp 在 2.7 中可用。它只是在 3.3 中稍微改变了行为。 感谢@jfs 的警告!

以上是关于将字符串转换为日期时间对象的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 日期字符串转换为 JavaScript 日期对象

如何将日期字符串转换为日期或日历对象?

如何将 Java 日期字符串/对象转换为 JFreeChart 日期格式?

将日期时间转换为字符串 PHP

如何将日期字符串转换为 UTC 日期对象?

JavaScript 之日起对象(转)