diferencia de horar con zona horaria misteriosamente aparece 19:00:00

984 views
Skip to first unread message

Jorge Cadena

unread,
Apr 10, 2014, 4:44:00 PM4/10/14
to djan...@googlegroups.com
Hola.

Estoy calculando el tiempo de duración ciertas operaciones. lo hago de la manera mas sencilla con time, asi

>>> import time
>>> import datetime
>>> ahora = time.time()
>>> datetime.datetime.fromtimestamp(time.time() - ahora).strftime('%I:%M:%S')
Resultado
>>> 00:01:01

Ese resultado es cuando la zona horaria de django esta en UTC, pero cuando hago el cambio para America/Bogota, tengo un resultado como este.

>>> 19:01:01

Como puedo obtener el resultado de UTC pero con la zona horaria de America/Bogota ?

alguna sugerencia ?

Eduard Diaz

unread,
Apr 11, 2014, 3:10:40 PM4/11/14
to djan...@googlegroups.com
Hola,

Has probado con pytz [1]

La parte mas complicada es entender que datetime trabaja por defecto sin la información del timezone, por lo que una vez que obtenemos una fecha con datetime hay que añadir esa información (marcarla como local).

Una vez que la tenemos "localizada" podemos convertirla a UTC y normalizarla para poder operar en los límites de una zona horaria que provoca el cambio de zona.

A partir de aquí ya podemos utilizar los timezones de pytz para mostrarla para la zona horaria que queramos.

Ejemplo con python 2.7.3

import pytz, datetime

# Definimos las zonas horarias
utc = pytz.utc
madrid = pytz.timezone('Europe/Madrid')
bogota = pytz.timezone('America/Bogota')
melbourne = pytz.timezone('Australia/Melbourne')
caracas = pytz.timezone('America/Caracas')
los_angeles = pytz.timezone('America/Los_Angeles')

# obtenemos la fecha
dt = datetime.datetime.now()

# Localizamos la fecha con la informacion de la timezone
# En mi caso utilizando la timezone de madrid
local_dt = madrid.localize(dt)

# Una vez localizada hacemos la conversion a utc y normalizamos
utc_dt = utc.normalize(local_dt.astimezone(utc))

# Ahora podemos hace la conversion al timezone normalizando utc_dt
bogota_dt = bogota.normalize(utc_dt)
melbourne_dt = melbourne.normalize(utc_dt)
caracas_dt = caracas.normalize(utc_dt)
los_angeles_dt = los_angeles.normalize(utc_dt)

# Prueba
fmt = '%Y-%m-%d %H:%M:%S'
print 'UTC = ', utc_dt.strftime(fmt)
print 'Los Angeles =', los_angeles_dt.strftime(fmt)
print 'Bogota =', bogota_dt.strftime(fmt)
print 'Caracas =', caracas_dt.strftime(fmt)
print 'Madrid =', local_dt.strftime(fmt)
print 'Melbourne =', melbourne_dt.strftime(fmt)


--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
//////////////////////////////////////////////////////////////////////////
Eduard Díaz
www.scopia.es
SCOPIA VISUAL INTERFACES SYSTEMS S.L.
Carrer Girona 25, 3er 2ona, 08010 Barcelona
Tel. 625 055 126
//////////////////////////////////////////////////////////////////////////

Aztrock

unread,
Apr 11, 2014, 4:56:01 PM4/11/14
to djan...@googlegroups.com
En términos prácticos, seria utilizar el time_zone de django y cuando quiera calcular tiempo, realizo la convercion a UTC y cuando termine la regreso a la que necesite.

Realice la conversión y todas la pruebas de la zona horaria poro solo obtengo 0 cuando la zona horaria esta en UTC.

Gracias Eduard!
Un hombre de carácter podrá ser derrotado pero jamás destruido.

ERNEST HEMINGWAY.

Eduard Diaz

unread,
Apr 12, 2014, 6:30:57 AM4/12/14
to djan...@googlegroups.com
Hola Jorge,

Los ejemplos anteriores eran para explicar un poco el funcionamiento.

Pero en verdad para trabajar con django y las zonas horarias, primero hay que asegurarse que en el settings.py está las opción

USE_TZ = True
TIME_ZONE = 'America/Bogota' #o la time zone de donde se encuentre el servidor

Con esta configuración los campos datetimes ya se guardan en UTC por lo que para convertirlos sólo hay que normalizarlos

Ejemplo:

>>> import pytz

>>> madrid = pytz.timezone('Europe/Madrid')
>>> bogota = pytz.timezone('America/Bogota')
>>> fmt = '%Y-%m-%d %H:%M:%S'
>>> date = User.objects.get(id=1).date_joined
>>> print date.strftime(fmt) # UTC
2014-02-22 19:14:21
>>> print madrid.normalize(date).strftime(fmt)
2014-02-22 20:14:21
>>> print bogota.normalize(date).strftime(fmt)
2014-02-22 14:14:21

Espero que ahora se vea más claro

Lo de "Sólo obtengo 0 cuando cuando la zona horaria esta en UTC" no lo acabo de entender, ¿que quieres decir?

Saludos



--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Un hombre de carácter podrá ser derrotado pero jamás destruido.

ERNEST HEMINGWAY.

--

Aztrock

unread,
Apr 12, 2014, 10:16:51 AM4/12/14
to djan...@googlegroups.com
Estoy realizando restas de tiempo. por ejemplo

ahora = time.time()
print (time.time() - ahora)

y tengo un resultado. ese resultado lo convierto a formato legible para humanos. con datetime y tengo un resultado por ejemplo

00:00:50


tengo 00 horas, con 00 minutos con 50 segundos.

Pero cuanto normalizo la zona horaria en django con America/Bogota.

tengo algo como esto

19:00:50

no se por que tengo 19 horas con 00 minutos con 50 segudos.

no se de donde saca las 19 horas.


Reply all
Reply to author
Forward
0 new messages