Python'da tutarsız datetime ayrıştırma saat dilimi

Nov 23 2020

Python 3.X'te aşağıdakileri çalıştırdığımda

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)

alırım

2019-01-02 03:04:05.000000 UTC
2019-01-02 03:04:05.000000 

Saat dilimi bilgileri neden kayboldu ve bu sorunu nasıl düzeltebilirim?

Yanıtlar

2 MrFuppes Nov 24 2020 at 07:13

Tutarsız gerçekten ... nokta olmasıdır %Zmarkaları strptime kabul belirli dizeleri (GMT UTC ve time.tzname herhangi bir değer - docs ), ama aslında bunun dışında herhangi bir şey yapmaz. Ör:

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)

Ortaya çıkan datetime nesnesi naiftir; artık UTC belirtisi yok.

Bu davranışı hesaba katmak için, datetime nesnesini sonradan işleyebilirsiniz.

if "UTC" in s: 
    dt = dt.replace(tzinfo=timezone.utc)

(biraz acı verici olduğunu düşünüyorum ...) veya "UTC" %zyi UTC 1 olarak ayrıştıran bir şeyle değiştirin ,

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)

(biraz çirkin olduğunu düşünüyorum ...) veya uygun bir ayrıştırıcı kullanın, ör.

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

(performans bir sorunsa bu biraz daha yavaş olacaktır ...).


1 IMO, bu da tutarsızdır; "+00: 00" aynı zamanda, o saatte UTC farkı 0 saat olan bazı saat dilimlerinin UTC farkı olabilir ...