Python仅对解析ISO 8601时间戳提供有限支持。因为strptime您需要确切地知道它的格式。作为一种复杂情况,a的字符串datetime化为ISO 8601时间戳,以空格作为分隔符,并用6位小数表示:
str(datetime.datetime(2016, 7, 22, 9, 25, 59, 555555)) # '2016-07-22 09:25:59.555555'
但是如果小数为0,则不会输出小数部分
str(datetime.datetime(2016, 7, 22, 9, 25, 59, 0)) # '2016-07-22 09:25:59'
但是,这2种形式需要不同的格式strptime。此外,strptime' does not support at all parsing minute timezones that have a:in it, thus2016-07-22 can be parsed, but the standard format09:25:59 + 0300 2016-07-22 09:25:59 + 03:00`不能。
有一个称为的单文件库iso8601,可以正确解析ISO 8601时间戳,并且仅解析它们。
它支持分数和时区,并且T分隔符都具有一个功能:
import iso8601 iso8601.parse_date('2016-07-22 09:25:59') # datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>) iso8601.parse_date('2016-07-22 09:25:59+03:00') # datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<FixedOffset '+03:00' ...>) iso8601.parse_date('2016-07-22 09:25:59Z') # datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>) iso8601.parse_date('2016-07-22T09:25:59.000111+03:00') # datetime.datetime(2016, 7, 22, 9, 25, 59, 111, tzinfo=<FixedOffset '+03:00' ...>)
如果未设置时区,则iso8601.parse_date默认为UTC。可以使用default_zone关键字参数更改默认区域。值得注意的是,如果这None不是默认值,那么那些没有显式时区的时间戳将作为天真日期时间返回:
iso8601.parse_date('2016-07-22T09:25:59', default_timezone=None) # datetime.datetime(2016、7、22、9、25、59) iso8601.parse_date('2016-07-22T09:25:59Z', default_timezone=None) # datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)