Pytz utc umwandlung

Was ist der richtige Weg, um eine naive Zeit und ein tzinfo in eine UTC Zeit umzuwandeln? Sage ich habe:

 d = datetime(2009, 8, 31, 22, 30, 30) tz = timezone('US/Pacific') 

Erster Weg, pytz inspiriert:

 d_tz = tz.normalize(tz.localize(d)) utc = pytz.timezone('UTC') d_utc = d_tz.astimezone(utc) 

Zweiter Weg von UTCDateTimeField

 def utc_from_localtime(dt, tz): dt = dt.replace(tzinfo=tz) _dt = tz.normalize(dt) if dt.tzinfo != _dt.tzinfo: # Houston, we have a problem... # find out which one has a dst offset if _dt.tzinfo.dst(_dt): _dt -= _dt.tzinfo.dst(_dt) else: _dt += dt.tzinfo.dst(dt) return _dt.astimezone(pytz.utc) 

Unnötig zu sagen, diese beiden Methoden produzieren unterschiedliche Ergebnisse für ein paar Zeitzonen.

Frage ist – was ist der richtige Weg?

4 Solutions collect form web for “Pytz utc umwandlung”

Ihre erste Methode scheint das genehmigte zu sein, und sollte DST-bewusst sein.

Du könntest es ein bisschen verkürzen, da pytz.utc = pytz.timezone ('UTC') , aber du wusstest das schon 🙂

 tz = timezone('US/Pacific') def toUTC(d): return tz.normalize(tz.localize(d)).astimezone(pytz.utc) print "Test: ", datetime.datetime.utcnow(), " = ", toUTC(datetime.datetime.now()) 

Was ist der richtige Weg, um eine naive Zeit und ein tzinfo in eine utc Zeit umzuwandeln?

Diese Antwort zählt einige Probleme mit der Umwandlung einer Ortszeit in UTC :

 from datetime import datetime import pytz # $ pip install pytz d = datetime(2009, 8, 31, 22, 30, 30) tz = pytz.timezone('US/Pacific') # a) raise exception for non-existent or ambiguous times aware_d = tz.localize(d, is_dst=None) ## b) assume standard time, adjust non-existent times #aware_d = tz.normalize(tz.localize(d, is_dst=False)) ## c) assume DST is in effect, adjust non-existent times #aware_d = tz.normalize(tz.localize(naive_d, is_dst=True)) # convert to UTC utc_d = aware_d.astimezone(pytz.utc) 

Verwenden Sie die erste Methode. Es gibt keinen Grund, das Rad der Zeitzonenumwandlung neu zu erfinden

  import pytz from django.utils import timezone tz = pytz.timezone('America/Los_Angeles') time = tz.normalize(timezone.now()) 
Python ist die beste Programmiersprache der Welt.