Python에서 일치하지 않는 datetime 구문 분석 시간대

Nov 23 2020

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)

나는 얻다

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

시간대 정보가 사라진 이유는 무엇이며이 문제를 어떻게 해결할 수 있습니까?

답변

2 MrFuppes Nov 24 2020 at 07:13

일관성은 참 ... 포인트는 점이다 %Z차종이 strptime 동의 특정 문자열 (GMT, UTC와 time.tzname의 값 - 워드 프로세서 ), 실제로 그것에서 아무것도하지 않습니다. 전의:

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)

결과 datetime 객체는 순진합니다. 더 이상 UTC의 흔적이 없습니다.

이 동작을 설명하기 위해 다음과 같이 datetime 객체를 후 처리 할 수 ​​있습니다.

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

(내가 생각하기에 약간 고통 스럽습니다 ...) 또는 "UTC" %z를 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)

(내가 생각하기에 약간 못 생겼습니다 ...) 또는 적절한 파서를 사용하십시오.

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

(성능이 문제라면 약간 느려질 것입니다 ...).


1 IMO, 이것도 일관성이 없습니다. "+00 : 00"은 당시 UTC 오프셋이 0 시간 인 일부 시간대의 UTC 오프셋 일 수도 있습니다.