mexico convert change argentina python datetime utc pytz

python - convert - conversión pytz utc



strftime python (4)

¿Cuál es la forma correcta de convertir un tiempo ingenuo y un tzinfo en un tiempo utc?

Esta respuesta enumera algunos problemas con la conversión de una hora local a 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)

¿Cuál es la forma correcta de convertir un tiempo ingenuo y un tzinfo en un tiempo UTC? Di que tengo:

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

Primera forma, inspirada en pytz:

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

Segunda vía, desde 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)

No hace falta decir que estos dos métodos producen resultados diferentes para bastantes zonas horarias.

La pregunta es: ¿cuál es el camino correcto?


Su primer método parece ser el aprobado, y debe ser compatible con DST.

Podría acortarlo un poco, ya que pytz.utc = pytz.timezone (''UTC'') , pero eso ya lo sabía :)

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())


Utiliza el primer método. No hay razón para reinventar la rueda de la conversión de la zona horaria.


import pytz from django.utils import timezone tz = pytz.timezone(''America/Los_Angeles'') time = tz.normalize(timezone.now())