use*_*326 38 python datetime iso rfc3339
我正在尝试将ISO转换为datetime使用以下代码:
dt = datetime.datetime.strptime("2013-07-23T15:10:59.342107+01:00",
"%Y-%m-%dT%H:%M:%S.%f%z")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S.%f%z'
Run Code Online (Sandbox Code Playgroud)
将格式上面的ISO字符串转换为对象的最佳方法是什么datetime?我使用的是Python 2.7.6版.
Max*_*Max 24
欢迎来到Python datetime!处理日期和时间必然很复杂,并且Python不完全使用本案例中包含的电池.你不能使用%zin,strptime因为Python没有代表时区的类(你应该实现自己的,或者更好的包括其他一些库).
你想用pytz和python-dateutil.有关详细信息,请参阅此处
dno*_*zay 22
我有一个类似的问题,从输出中解析提交日期git log --date=iso8601实际上不是ISO8601格式(因此--date=iso8601-strict在更高版本中添加).
>>> import datetime, sys
>>> datetime.datetime.strptime("2013-07-23T15:10:59.342107+01:00", "%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S.%f%z'
>>> sys.version
'2.7.10 (default, Feb 7 2017, 00:08:15) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)]'
Run Code Online (Sandbox Code Playgroud)
如果python 2 %z由于底层strptime()实现而不支持,那么解决问题的一种可能方法是迁移到python 3.但它对我不起作用:
>>> import datetime, sys
>>> datetime.datetime.strptime("2013-07-23T15:10:59.342107+01:00", "%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_strptime.py", line 565, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_strptime.py", line 362, in _strptime
(data_string, format))
ValueError: time data '2013-07-23T15:10:59.342107+01:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
>>> sys.version
'3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) \n[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]'
Run Code Online (Sandbox Code Playgroud)
问题是因为不是严格的ISO8601(注意:时区信息中有一个).
>>> datetime.datetime.strptime("2013-07-23T15:10:59.342107+0100", "%Y-%m-%dT%H:%M:%S.%f%z")
datetime.datetime(2013, 7, 23, 15, 10, 59, 342107, tzinfo=datetime.timezone(datetime.timedelta(0, 3600)))
Run Code Online (Sandbox Code Playgroud)
因为我正在使用django我可以利用那里的实用程序.
https://github.com/django/django/blob/master/django/utils/dateparse.py
>>> from django.utils.dateparse import parse_datetime
>>> parse_datetime('2013-07-23T15:10:59.342107+01:00')
datetime.datetime(2013, 7, 23, 15, 10, 59, 342107, tzinfo=+0100)
Run Code Online (Sandbox Code Playgroud)
而不是strptime你可以使用自己的正则表达式.
请注意,django确实pytz在引擎盖下用于utc单身人士之类的东西.
如果你想要一个快速而肮脏的解决方案,你可以使用类似于django没有所有要求的东西.
https://gist.github.com/dnozay/3cd554a818ed768bff804bc04484905d
>>> from datetime_z import parse_datetime
>>> parse_datetime("2013-07-23T15:10:59.342107+01:00")
datetime.datetime(2013, 7, 23, 15, 10, 59, 342107, tzinfo=+0100)
Run Code Online (Sandbox Code Playgroud)
请注意:YMMV,没有支持.
| 归档时间: |
|
| 查看次数: |
40769 次 |
| 最近记录: |