如何将时区了解字符串在Python日期时间不dateutil转换?(How to convert a

2019-06-18 18:23发布

我不得不转换时区感知串到Python datetime对象。

例如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")

Answer 1:

对于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太沉重,重的你,用iso8601相反,它会分析你的具体格式就好了:

>>> 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更是高达 4KB小。 与此相比,TOT 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)))

缺乏适当的ISO 8601的解析正在被跟踪的Python问题15873 。



Answer 2:

这里是Python 文档使用dateutil包对象的日期时间..

from dateutil.parser import parse

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


Answer 3:

有两个问题与原来的问题代码:不应该有一个:在时区和格式字符串的“时区作为偏移”是小写%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


Answer 4:

我是新来的Python,而是找到了一种方法来转换

2017-05-27T07:20:18.000-04:00

2017-05-27T07:20:18 ,而无需下载新的应用程序。

from datetime import datetime, timedelta

time_zone1 = int("2017-05-27T07:20:18.000-04:00"[-6:][:3])
>>returns -04

item_date = datetime.strptime("2017-05-27T07:20:18.000-04:00".replace(".000", "")[:-6], "%Y-%m-%dT%H:%M:%S") + timedelta(hours=-time_zone1)

我敢肯定有更好的方法来做到这一点不切片了绳子那么多,但是这让完成任务。



Answer 5:

您可以将这样的。

date = datetime.datetime.strptime('2019-3-16T5-49-52-595Z','%Y-%m-%dT%H-%M-%S-%f%z')
date_time = date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')


文章来源: How to convert a timezone aware string to datetime in python without dateutil?