我必须将像"2012-11-01T04:16:13-04:00"
这样的时区感知字符串转换为Pythondatetime
对象。
我看到了具有解析功能的dateutil
模块,但我真的不想使用它,因为它添加了依赖项。
那我该怎么做呢?我已经尝试过类似以下内容的方法,但没有运气。
datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")
从 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小。比较一下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问题 15873 中跟踪了缺乏正确的 ISO 8601 解析。
这是使用 dateutil 包的 datetime 对象的 Python 文档。
from dateutil.parser import parse
get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj
原始问题中的代码有两个问题:时区中不应有:
,并且"时区作为偏移量">的格式字符串是小写的%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
你可以像这样转换。
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')
您可以创建一个不识别时区的对象并替换该tzinfo
,并在以后将其设置为时区感知DateTime
对象。
from datetime import datetime
import pytz
unaware_time = datetime.strptime("2012-11-01 04:16:13", "%Y-%m-%d %H:%M:%S")
aware_time = unaware_time.replace(tzinfo=pytz.UTC)
我是 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)
我相信有更好的方法可以做到这一点,而不会把绳子切得太多,但这完成了工作。
Mohideen bin Mohammed使用dateutil的建议绝对是最好的解决方案,即使它确实需要一个小库。 在那里使用了其他方法,容易出现各种形式的失败。这是一个很好的功能。
from dateutil.parser import parse
def parse_date_convert(date, fmt=None):
if fmt is None:
fmt = '%Y-%m-%d %H:%M:%S' # Defaults to : 2022-08-31 07:47:30
get_date_obj = parse(str(date))
return str(get_date_obj.strftime(fmt))
dates = ['2022-08-31T07:47:30Z','2022-08-31T07:47:29.098Z','2017-05-27T07:20:18.000-04:00','2012-11-01T04:16:13-04:00']
for date in dates:
print(f'Before: {date} After: {parse_date_convert(date)}')
结果:
Before: 2022-08-31T07:47:30Z After: 2022-08-31 07:47:30
Before: 2022-08-31T07:47:29.098Z After: 2022-08-31 07:47:29
Before: 2017-05-27T07:20:18.000-04:00 After: 2017-05-27 07:20:18
Before: 2012-11-01T04:16:13-04:00 After: 2012-11-01 04:16:13
尝试了各种形式,例如切片拆分替换 T Z,如下所示:
dates = ['2022-08-31T07:47:30Z','2022-08-31T07:47:29.098Z','2017-05-27T07:20:18.000-04:00','2012-11-01T04:16:13-04:00']
for date in dates:
print(f'Before: {date} After: {date.replace("T", " ").replace("Z", "")}')
你仍然留下了低于标准的结果。 像下面这样
Before: 2022-08-31T07:47:30Z After: 2022-08-31 07:47:30
Before: 2022-08-31T07:47:29.098Z After: 2022-08-31 07:47:29.098
Before: 2017-05-27T07:20:18.000-04:00 After: 2017-05-27 07:20:18.000-04:00
Before: 2012-11-01T04:16:13-04:00 After: 2012-11-01 04:16:13-04:00