Python에서 시간대 인식 datetime 객체를 만드는 방법은 무엇입니까?

| | | | | | | | | | | | | | | | | | |

해야 할 일

시간대를 인식하지 못하는 datetime 개체가 있는데 다른 개체와 비교할 수 있도록 표준 시간대를 추가해야 합니다. 시간대 인식 날짜/시간 객체. 이 한 가지 기존 사례에 대해 전체 애플리케이션을 시간대를 인식하지 못하는 상태로 변환하고 싶지 않습니다.

내가 시도한 것

먼저, 문제를 설명하기 위해 :

Python 2.6.1(r261:67515, 2010년 6월 24일, 21:47:49) [GCC 4.2.1(Apple Inc. 빌드 5646)] on darwin Type "help" , "저작권", "크레딧" 또는 "라이선스"를 참조하십시오. >> import datetime >>> import pytz >>> unware = datetime.datetime(2011,8 ,15,8,15,12,0) >>> unware datetime.datetime(2011, 8, 15, 8, 15, 12) >>> 인식 = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC) >>>>알림 datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)>>> Aware == unware Traceback(가장 최근 호출 마지막): 파일 "<stdin>", 행 1, <module> TypeError: can"t compare offset-naive and offset-aware datetimes 

먼저 astimezone을 시도했습니다.

>>> unaware.astimezone(pytz.UTC) 역추적(가장 최근 호출 마지막): 파일 "<stdin>", 라인 1, <module> ValueError: astimezone()은 순진한 datetime >>> 

실제로 변환을 시도하기 때문에 이것이 실패한 것은 그다지 놀라운 일이 아닙니다. 교체가 더 나은 선택처럼 보였습니다(파이썬에서 "시간대 인식"인 datetime.today() 값을 얻으려면 어떻게 해야 합니까?):

>>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> unware == Aware Traceback(가장 최근 호출 마지막): 파일 "<stdin>", 라인 1, <module> TypeError: can"t compare offset-naive and offset-aware datetimes >>> 

보다시피, replace는 tzinfo를 설정하지만 객체를 인식하지 못하게 합니다. . 입력 문자열을 구문 분석하기 전에 시간대를 갖도록 다시 처리할 준비를 하고 있습니다(중요한 경우 구문 분석에 dateutil을 사용하고 있습니다). 하지만 이는 엄청나게 엉성한 것 같습니다.

또한, 나는 이것을 Python 2.6과 Python 2.7 모두에서 동일한 결과로 시도했습니다.

Context

저는 일부 데이터 파일에 대한 파서를 작성 중입니다. 날짜 문자열에 시간대 표시기가 없는 경우 지원해야 하는 이전 형식이 있습니다. 이미 데이터 소스를 수정했지만 여전히 레거시 데이터 형식을 지원해야 합니다. 레거시 데이터의 일회성 변환은 다양한 비즈니스 BS 이유로 옵션이 아닙니다. 일반적으로 하드라는 아이디어는 마음에 들지 않습니다. -기본 시간대 코딩, 이 경우 가장 좋은 옵션인 것 같습니다. 문제의 모든 레거시 데이터가 UTC에 있다는 것을 합리적인 확신으로 알고 있으므로 이 경우 기본 시간대를 기본값으로 설정하는 위험을 감수할 준비가 되어 있습니다.