Co muszę zrobić
Mam obiekt datetime nieświadomy strefy czasowej, do którego muszę dodać strefę czasową, aby móc ją porównać z innymi obiektami datetime rozpoznającymi strefę czasową. Nie chcę przekonwertować całej aplikacji na strefę czasową, nieświadoma tego jednego starszego przypadku.
Co próbowałem
Po pierwsze, aby zademonstrować problem:
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
Najpierw spróbowałem astimezonu:
>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>
Nic dziwnego, że to się nie powiodło, ponieważ tak naprawdę próbuje dokonać konwersji. Zastąpienie wydawało się lepszym wyborem (jak w Pythonie: jak uzyskać wartość datetime.today (), która jest „świadoma strefy czasowej”? ):
>>> 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
>>>
Ale jak widać, zamień wydaje się ustawiać tzinfo, ale nie uświadamia obiektu. Przygotowuję się do powrotu do sprawdzania łańcucha wejściowego, aby mieć strefę czasową przed analizowaniem (używam dateutil do analizowania, jeśli to ma znaczenie), ale to wydaje się niesamowicie niewyraźne.
Próbowałem tego również w Pythonie 2.6 i Pythonie 2.7, z tymi samymi wynikami.
Kontekst
Piszę parser dla niektórych plików danych. Jest stary format, który muszę obsługiwać, gdy ciąg daty nie ma wskaźnika strefy czasowej. Naprawiłem już źródło danych, ale nadal muszę obsługiwać starszy format danych. Jednorazowa konwersja starszych danych nie jest opcją z różnych powodów biznesowych BS. Chociaż ogólnie nie podoba mi się pomysł zaprogramowania domyślnej strefy czasowej, w tym przypadku wydaje się to najlepsza opcja. Wiem z wystarczającą pewnością, że wszystkie starsze dane, o których mowa, znajdują się w UTC, więc jestem gotów zaakceptować ryzyko niedotrzymania tego w tym przypadku.
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
arg, aby był bardziej czytelny:datetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
powróciłby,None
gdyby modyfikowałunaware
obiekt w miejscu. REPL pokazuje, że.replace()
zwraca tutaj nowydatetime
obiekt.