Hoe maak je een tijdzone bewust datetime-object in Python?

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

Wat ik moet doen

Ik heb een tijdzone-onbewust datetime-object, waaraan ik een tijdzone moet toevoegen om het met andere te kunnen vergelijken timezone-aware datetime-objecten. Ik wil niet mijn hele applicatie omzetten naar een tijdzone die ik niet weet voor dit ene oude geval.

Wat ik heb geprobeerd

Ten eerste, om het probleem aan te tonen :

Python 2.6.1 (r261:67515, 24 juni 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] op darwin Type "help" , "copyright", "credits" of "licentie" voor meer informatie. >>> import datetime >>> import pytz >>> niet op de hoogte = datetime.datetime(2011,8 ,15,8,15,12,0) >>> niet bekend datetime.datetime(2011, 8, 15, 8, 15, 12) >>> bewust = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC) >>> bewust datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> bewust == niet op de hoogte Traceback (meest recente oproep laatste): Bestand "<stdin>", regel 1, in <module> TypeError: kan offset-naïeve en offset-bewuste datumtijden niet vergelijken 

Eerst probeerde ik astimezone:

>>> niet op de hoogte.astimezone(pytz.UTC) Traceback (meest recente oproep laatst): Bestand "<stdin>", regel 1, in <module> ValueError: astimezone() kan niet worden toegepast op een naïeve datetime >>> 

Het is niet erg verrassend dat dit mislukt, aangezien het eigenlijk een conversie probeert uit te voeren. Vervangen leek een betere keuze (volgens Hoe krijg ik een waarde van datetime.today() in Python die "tijdzonebewust" is?):

>>> niet op de hoogte.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> niet op de hoogte == bewust Traceback (meest recente oproep laatst): Bestand "<stdin>", regel 1, in <module> TypeError: kan "offset-naïeve en offset-bewuste datetimes >>> 

Maar zoals je kunt zien, lijkt vervangen de tzinfo in te stellen, maar het object niet bewust te maken Ik maak me klaar om terug te vallen op het bewerken van de invoerstring om een tijdzone te hebben voordat ik het parseer (ik gebruik dateutil voor het parseren, als dat van belang is), maar dat lijkt ongelooflijk onhandig.

Ook, Ik heb dit in zowel Python 2.6 als Python 2.7 geprobeerd, met dezelfde resultaten.

Context

Ik ben een parser aan het schrijven voor enkele gegevensbestanden. Er is een oud formaat dat ik moet ondersteunen waarbij de datumreeks geen tijdzone-indicator heeft. Ik heb de gegevensbron al gerepareerd, maar ik moet nog steeds het oude gegevensformaat ondersteunen. Een eenmalige conversie van de oude gegevens is om verschillende zakelijke BS-redenen geen optie. Hoewel ik over het algemeen niet van het idee van harde -coderen van een standaardtijdzone, in dit geval lijkt dit de beste optie. Ik weet met redelijk vertrouwen dat alle betreffende verouderde gegevens in UTC zijn, dus ik ben bereid het risico te accepteren dat ik in dit geval in gebreke blijf.