Kể từ Python 3.7, datetime.datetime.fromisoformat()
có thể xử lý định dạng của bạn:
>>> 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)))
Trong các phiên bản Python cũ hơn, bạn không thể, không phải không có toàn bộ quá trình xác định múi giờ thủ công.
Python không bao gồm cơ sở dữ liệu múi giờ, vì nó sẽ lỗi thời quá nhanh. Thay vào đó, Python dựa vào các thư viện bên ngoài, có thể có chu kỳ phát hành nhanh hơn nhiều, để cung cấp múi giờ được định cấu hình đúng cho bạn.
Như một tác dụng phụ, điều này có nghĩa là phân tích cú pháp múi giờ cũng cần phải là một thư viện bên ngoài. Nếu dateutil
quá nặng đối với bạn, hãy sử dụng iso8601
thay thế, nó sẽ phân tích cú pháp định dạng cụ thể của bạn rất tốt:
>>> 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
là một 4KB nhỏ khổng lồ . So sánh python-dateutil
tổng 148KB của tổng.
Kể từ Python 3.2, Python có thể xử lý các múi giờ dựa trên bù đắp đơn giản và %z
sẽ phân tích cú pháp -hhmm
và +hhmm
chênh lệch múi giờ trong một dấu thời gian. Điều đó có nghĩa là đối với dấu thời gian ISO 8601, bạn phải xóa dấu thời gian :
trong múi giờ:
>>> 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)))
Việc thiếu phân tích cú pháp ISO 8601 thích hợp đang được theo dõi trong vấn đề Python 15873 .