Múi giờ phân tích cú pháp datetime không nhất quán trong Python
Khi tôi chạy phần sau trong Python 3.X
import datetime
DATE_TS_FORMAT = '%Y-%m-%d %H:%M:%S.%f %Z'
date_ts = datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)
date_ts = datetime.datetime.strptime(date_ts, DATE_TS_FORMAT)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)
tôi có
2019-01-02 03:04:05.000000 UTC
2019-01-02 03:04:05.000000
Tại sao thông tin múi giờ biến mất và làm cách nào để khắc phục sự cố này?
Trả lời
Thực sự không nhất quán ... Vấn đề là nó %Zkhiến strptime chấp nhận một số chuỗi nhất định (GMT, UTC và bất kỳ giá trị nào trong time.tzname - docs ), nhưng không thực sự tạo ra bất cứ điều gì từ nó. Ví dụ:
from datetime import datetime
s = "2019-01-02 03:04:05.000000 UTC"
dt = datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f %Z')
print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5)
Đối tượng datetime kết quả là ngây thơ; không có dấu hiệu của UTC nữa.
Để giải thích cho hành vi này, bạn có thể xử lý hậu đối tượng datetime, chẳng hạn như
if "UTC" in s:
dt = dt.replace(tzinfo=timezone.utc)
(mà tôi nghĩ là hơi đau ...) hoặc thay thế "UTC" bằng thứ gì đó %zphân tích cú pháp thành UTC 1 ,
dt = datetime.strptime(s.replace("UTC", "+00:00"), '%Y-%m-%d %H:%M:%S.%f %z')
print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)
(mà tôi nghĩ là hơi xấu ...) hoặc sử dụng trình phân tích cú pháp phù hợp, ví dụ:
from dateutil.parser import parse
dt = parse(s)
print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=tzutc())
print(dt.strftime('%Y-%m-%d %H:%M:%S.%f %Z'))
# 2019-01-02 03:04:05.000000 UTC
(sẽ chậm hơn một chút nếu hiệu suất là một vấn đề ...).
1 IMO, điều này cũng không nhất quán; "+00: 00" cũng có thể là chênh lệch UTC của một số múi giờ xảy ra có chênh lệch UTC là 0 giờ tại thời điểm đó ...