使用最少的庫解析任意 ISO 8601 時間戳
Python 對解析 ISO 8601 時間戳的支援有限。對於 strptime
,你需要確切地知道它是什麼格式。作為一個複雜因素,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'
但是這兩種形式對於 strptime
需要不同的格式。此外,strptime' does not support at all parsing minute timezones that have a
:in it, thus
2016-07-22 09:25:59 + 0300can be parsed, but the standard format
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>)