如何在没有dateutil的python中将时区感知字符串转换为datetime?

2024-04-25 20:38:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须将时区感知字符串转换为pythondatetime对象。

例如2012-11-01T04:16:13-04:00

我发现有一个dateutil模块有一个解析函数来完成它,但是我不想使用它,因为它添加了一个依赖项。

那我该怎么做呢?我试过如下的方法,但没有成功。

datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")

Tags: 模块对象方法函数字符串datetimedateutilstrptime
3条回答

从Python 3.7开始,datetime.datetime.fromisoformat()可以处理您的格式:

>>> import datetime
>>> datetime.datetime.fromisoformat('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))

在较旧的Python版本中,如果没有大量的人工时区定义,就不能这样做。

Python不包括时区数据库,因为它会很快过时。相反,Python依赖外部库来为您提供正确配置的时区,外部库的发布周期要快得多。

作为副作用,这意味着时区解析也需要是一个外部库。如果dateutil对您来说太重,请改用^{},它将很好地解析您的特定格式:

>>> import iso8601
>>> iso8601.parse_date('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=<FixedOffset '-04:00'>)

iso8601非常小。比较一下python-dateutil的148KB。

从Python 3.2开始,Python可以处理简单的基于偏移量的时区,并且%z将解析时间戳中的-hhmm+hhmm时区偏移量。这意味着对于ISO 8601时间戳,您必须删除时区中的:

>>> from datetime import datetime
>>> iso_ts = '2012-11-01T04:16:13-04:00'
>>> datetime.strptime(''.join(iso_ts.rsplit(':', 1)), '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))

Python issue 15873中正在跟踪缺少正确的ISO 8601解析。

原始问题中的代码有两个问题:时区中不应该有:,而“时区作为偏移量”的格式字符串是小写%z而不是大写%Z

Python v3.6

>>> from datetime import datetime
>>> t = datetime.strptime("2012-11-01T04:16:13-0400", "%Y-%m-%dT%H:%M:%S%z")
>>> print(t)
2012-11-01 04:16:13-04:00

下面是使用dateutil包的datetime对象的PythonDoc。。

from dateutil.parser import parse

get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj

相关问题 更多 >