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