Tijdzone toevoegen aan een naïeve datetime-instantie in python

Ik heb een datetimedie geen tijdzone-informatie heeft. Ik krijg nu de tijdzone-informatie en wil de tijdzone toevoegen aan de bestaande datetime-instantie, hoe kan ik dat doen?

d = datetime.datetime.now()
tz = pytz.timezone('Asia/Taipei')

Hoe de tijdzone-info tztoe te voegen aan datetime a


Antwoord 1, autoriteit 100%

Gebruik tz.localize(d)om de instantie te lokaliseren. Uit de documentatie:

De eerste is om de methode localize() te gebruiken die wordt geleverd door de pytz-bibliotheek. Dit wordt gebruikt om een ​​naïeve datetime te lokaliseren (datetime zonder tijdzone-informatie):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print(loc_dt.strftime(fmt))
2002-10-27 06:00:00 EST-0500

Als u niettz.localize()gebruikt, maar datetime.replace()gebruikt, is de kans groot dat een historischeoffset gebruikt; tz.localize()kiest de juiste offset die van kracht is voor de opgegeven datum. De begin- en einddatums van de Amerikaanse oostelijke tijdzone DST zijn bijvoorbeeld in de loop van de tijd veranderd.

Wanneer u een datetime-waarde probeert te lokaliseren die dubbelzinnig is omdat deze zich uitstrekt over de overgangsperiode van zomer- naar wintertijd of omgekeerd, wordt de tijdzone geraadpleegd om te zien of het resulterende datetime-object .dst()geef True of False terug. U kunt de standaard voor de tijdzone overschrijven met het is_dsttrefwoordargument voor .localize():

dt = tz.localize(naive, is_dst=True)

of schakel de keuze zelfs helemaal uit door is_dst=Nonein te stellen. In dat geval, of in de zeldzame gevallen dat er isgeen standaard ingesteld voor een tijdzone, zou een ambigue datetime-waarde ertoe leiden dat een AmbiguousTimeError-uitzondering wordt gegenereerd. De vlag is_dstwordt alleen geraadpleegd voor datum/tijd-waarden die dubbelzinnig zijn en wordt anders genegeerd.

Om de andere kant op terug te gaan, verander een tijdzonebewust object terug in een naïef object, gebruik .replace(tzinfo=None):

naivedt = awaredt.replace(tzinfo=None)

Antwoord 2, autoriteit 21%

Als u weet dat uw oorspronkelijke datum/tijd werd “gemeten” in de tijdzone die u eraan probeert toe te voegen, kunt u (maar zou dat waarschijnlijk niet moeten) replacegebruiken in plaats van localize.

# d = datetime.datetime.now()
# tz = pytz.timezone('Asia/Taipei')
d = d.replace(tzinfo=tz)

Ik kan me 2 keer voorstellen dat dit logisch zou kunnen zijn (de tweede overkwam mij):

  1. Uw serverlandinstelling is ingesteld op de onjuiste tijdzone en u probeert een datetime-instantie te corrigeren door deze op de hoogte te stellen van deze onjuiste tijdzone (en vermoedelijk later te lokaliseren naar de “juiste” tijdzone dus de waarden van now() komen overeen met andere tijden waarmee u het vergelijkt (misschien uw horloge)
  2. U wilt een timeinstantie (NIETeen datetime) “taggen” met een tijdzone (tzinfo) attribuut zodat dat attribuut later worden gebruikt om een ​​volledige datetimeinstantie te vormen.

Other episodes