내가해야 할 일
시간대를 인식하지 못하는 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
먼저 시간대로 시도했습니다.
>>> 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에 따르면 : "timezone aware"인 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을 사용하고 있습니다).
또한 파이썬 2.6과 파이썬 2.7 에서이 결과를 시도했습니다.
문맥
일부 데이터 파일에 대한 파서를 작성 중입니다. 날짜 문자열에 시간대 표시 기가없는 곳에서 지원 해야하는 오래된 형식이 있습니다. 이미 데이터 소스를 수정했지만 여전히 레거시 데이터 형식을 지원해야합니다. 레거시 데이터의 일회성 변환은 다양한 비즈니스 BS 이유로 인해 옵션이 아닙니다. 일반적으로 기본 시간대를 하드 코딩하는 아이디어가 마음에 들지 않지만이 경우 가장 좋은 옵션 인 것 같습니다. 문제가되는 모든 레거시 데이터가 UTC로되어 있다는 확신을 가지고 있으므로이 경우 기본 설정의 위험을 감수 할 준비가되어 있습니다.
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
더 읽을 수 ARG를 :datetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
객체를 제자리None
에서 수정하면 반환 됩니다unaware
. REPL은 여기에.replace()
새로운datetime
객체 를 반환 한다는 것을 보여줍니다 .