Múi giờ phân tích cú pháp datetime không nhất quán trong Python

Nov 23 2020

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

2 MrFuppes Nov 24 2020 at 07:13

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 đó ...