프로그래밍 언어/Python

Python에서 시간대 인식 datetime 객체를 만드는 방법

Rateye 2021. 12. 10. 10:21
728x90
반응형
질문 : Python에서 시간대 인식 datetime 객체를 만드는 방법은 무엇입니까?

내가해야 할 일

시간대를 인식하지 못하는 datetime 객체가 있는데, 다른 시간대를 인식하는 datetime 객체와 비교할 수 있도록 시간대를 추가해야합니다. 이 레거시 사례를 인식하지 못하는 시간대로 전체 애플리케이션을 변환하고 싶지 않습니다.

내가 시도한 것

먼저 문제를 설명하려면 :

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  TypeError: can't compare offset-naive and offset-aware datetimes

먼저 astimezone을 시도했습니다.

>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>

실제로 변환을 시도하고 있기 때문에 이것이 실패한 것은 그리 놀라운 일이 아닙니다. 바꾸기가 더 나은 선택처럼 보였습니다 ( Python : "시간대 인식"인 datetime.today () 값을 얻는 방법? ) :

>>> unaware.replace(tzinfo=pytz.UTC)
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>>

그러나 보시다시피 replace는 tzinfo를 설정하는 것처럼 보이지만 객체를 인식하지 못합니다. 나는 그것을 파싱하기 전에 시간대를 갖기 위해 입력 문자열을 닥터 링 할 준비를하고 있지만 (중요한 경우 파싱을 위해 dateutil을 사용하고 있음), 그것은 믿을 수 없을 정도로 복잡해 보입니다.

또한 python 2.6과 python 2.7에서 동일한 결과로 이것을 시도했습니다.

문맥

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

답변

일반적으로 순진한 datetime 시간대를 인식하려면 localize 메소드를 사용하십시오.

import datetime
import pytz

unaware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0)
aware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0, pytz.UTC)

now_aware = pytz.utc.localize(unaware)
assert aware == now_aware

UTC 시간대의 경우 처리 할 일광 절약 시간 계산이 없으므로 localize

now_aware = unaware.replace(tzinfo=pytz.UTC)

공장. ( .replace 는 새 날짜 시간을 반환하며 unaware 못하도록 수정하지 않습니다.)

출처 : https://stackoverflow.com/questions/7065164/how-to-make-a-timezone-aware-datetime-object-in-python
728x90
반응형