django adelanta la hora de un objeto datetime

930 views
Skip to first unread message

Miguel Angel

unread,
Apr 5, 2015, 10:27:15 PM4/5/15
to djan...@googlegroups.com
A ver si me explico tengo un objeto datetime que viene de la base de datos pero solo quiero ver la hora y para eso hago esto objeto.time() para que devuelva la hora y no la fecha pero devuelve la hora 5 horas adelantada que creen ustedes que pueda estar pasando?

Gracias de antemano!


Nekmo

unread,
Apr 5, 2015, 10:42:26 PM4/5/15
to djan...@googlegroups.com
Django por defecto guarda la hora en UTC, si mal no recuerdo. Después,
aplica tu zona horaria a la almacenada a la base de datos, y muestra
así la hora correcta.

Este comportamiento por defecto, es como debería ser en cualquier base
de datos. Así, sea cual sea la zona horaria, es fácil tener almacenada
la hora correcta. Éste comportamiento se puede cambiar con este
parámetro: https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-USE_TZ

No obstante, te recomiendo no cambiarlo. Al imprimir la hora con los
métodos de Django, debería aplicar tu TZ y verse bien.

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: cont...@nekmo.com
XMPP/Jabber: cont...@nekmo.com
Google+: Nekmo Com
> --
> --
> 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.

Hiko hitokiri

unread,
Apr 5, 2015, 10:49:55 PM4/5/15
to djan...@googlegroups.com
para empezar no nos cuentes historias sobre donquijote ni cosas de esas por favor si no van a enseñar e codigo de el problema no hagan una pregunta
aqui como ya se a dicho nadie es vidente

Miguel Angel

unread,
Apr 5, 2015, 10:49:59 PM4/5/15
to djan...@googlegroups.com
pero yo cambie la zona horaria en el archivo setting  a 'America/Caracas' y aun a si muestra la hora adelantada 4.5 horas

Para obtener más opciones, visita https://groups.google.com/d/optout.



--
Miguel Hernandez
Tecnico IdealNet
Telf. 0414-149124

Nekmo

unread,
Apr 5, 2015, 11:35:11 PM4/5/15
to djan...@googlegroups.com
Hiko Hitokiri. El problema de Miguel es muy obvio, creo que hay
suficiente información. No hace falta ponerse así.

Miguel, como ya te he dicho, Django guarda la fecha en UTC. Es el
comportamiento normal y deseado. El problema, es que lo estás
serializando de la forma incorrecta. Te mostraré un ejemplo:
http://susepaste.org/17624614

En este caso, puedes ver cómo a la izquierda se está mostrando como
"21:57", pero en la base de datos, el comentario está creado a las
"20:57:23". Véase la consola de abajo y la vista de la db de arriba.
En España, tenemos UTC+1. Por eso, la fecha en la DB es una hora
menos.

Para que se vea correctamente, debes usar los métodos para imprimir la
hora que trae Django:
https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#date

En el caso del template de mi comentario::

<span>
{{ comm.created|date:"SHORT_DATE_FORMAT" }}
a las
{{ comm.created|date:"H:i" }}
</span>

Si aun así quieres usar tus propios métodos para imprimir la hora, te
recomiendo mirar cómo cambiar el tzinfo de un objeto datetime:
http://stackoverflow.com/questions/5452555/converting-timezone-aware-datetime-to-local-time-in-python

Saludos.

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: cont...@nekmo.com
XMPP/Jabber: cont...@nekmo.com
Google+: Nekmo Com


Miguel Angel

unread,
Apr 5, 2015, 11:51:27 PM4/5/15
to djan...@googlegroups.com
Hola Nekmo gracias por tu interés.
Cuando dejo que django imprima el objeto datetime lo hace correctamente pero yo solo quiero imprimir la hora no quiero que se vea la fecha hay viene el problema por eso en la vista le aplique el time() para que solo devuelva la hora una consulta y me disculpas como hago para hacer algo como esto

caracas = pytz.timezone("America/Caracas")
eastern = pytz.timezone("US/Eastern")
esteusa = eastern.localize(fechor)
fhcaracas = esteusa.astimezone(caracas)

cambiando "US/Eastern" por como UTC o como se llame su referencia

yo creo que con esto lo remedio

Hiko hitokiri

unread,
Apr 6, 2015, 12:03:53 AM4/6/15
to djan...@googlegroups.com
aun campo datetime puedes tanto desde la ista como desde el template obtener la hora

template y view
date.hour

Nekmo

unread,
Apr 6, 2015, 12:14:33 AM4/6/15
to djan...@googlegroups.com
Si lo estás imprimiendo en un template, es tan fácil, como decía en mi ejemplo::

{{ comm.created|date:"H:i" }}

Donde "H" corresponde a la hora, y "i" a los minutos. El filtro "date"
ya se encarga de cambiar el tzinfo del objeto datetime para que el tz
sea el correcto. Más información sobre el filtro "date" en el enlace
que te puse antes.

Por supuesto, también puedes ponerte a dar vueltas y complicar las
cosas usando pytz, como te dicen aquí:
http://stackoverflow.com/questions/14657173/get-local-timezone-in-django

Pero, ¿por qué complicar las cosas, cuando se puede hacer por el método fácil?

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: cont...@nekmo.com
XMPP/Jabber: cont...@nekmo.com
Google+: Nekmo Com


Nekmo

unread,
Apr 6, 2015, 12:19:51 AM4/6/15
to djan...@googlegroups.com
Si estás diciendo de usar la propiedad "hour" del objeto datetime, eso
es incorrecto. El objeto datetime viene por defecto con un tz UTC, que
seguramente no sea el deseado. Por supuesto, si tienes en el settings
USE_TZ como "True", funcionará, pero no es lo aconsejable. Si tu
código aspira a ser reutilizable, no puedes obligar a la gente a tener
USE_TZ como True.

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: cont...@nekmo.com
XMPP/Jabber: cont...@nekmo.com
Google+: Nekmo Com


Miguel Angel

unread,
Apr 6, 2015, 12:21:55 AM4/6/15
to djan...@googlegroups.com
perfecto gracias nekmo ya esta. creo que tengo que leer un poco mas! feliz noche madrugada para ti supongo!

Hiko hitokiri

unread,
Apr 6, 2015, 12:37:33 AM4/6/15
to djan...@googlegroups.com
parece jamas has visto el setting por que por defaut esa opcion esta en true

Nekmo

unread,
Apr 6, 2015, 12:43:04 AM4/6/15
to djan...@googlegroups.com
Mentira.

https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-USE_TZ

Como puedes leer en la documentación, por defecto está como False.
Puedes importar la configuración por defecto de global_settings si
crees que la documentación y yo estamos equivocados.

In [3]: from django.conf.global_settings import USE_TZ
In [4]: USE_TZ
Out[4]: False

Por favor, tengo que pedirte que no confundas a los nuevos.

Saludos.

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: cont...@nekmo.com
XMPP/Jabber: cont...@nekmo.com
Google+: Nekmo Com


El día 6 de abril de 2015, 6:36, Hiko hitokiri <las...@gmail.com> escribió:
> parece jamas has visto el setting por que por defaut esa opcion esta en true
>

Hiko hitokiri

unread,
Apr 6, 2015, 12:53:34 AM4/6/15
to djan...@googlegroups.com
claro y yo te voy a pedir que revises el setting de tu aplicación y veas que aun que en la documentación dice false ahi dice true asi que el que esta
confundiendo por no revisar las cosas eres tu

Nekmo

unread,
Apr 6, 2015, 1:11:05 AM4/6/15
to djan...@googlegroups.com
Pensaba que "USE_TZ" significaba "guardar con el timezone en la db",
no "soporte para TZ en db (es decir, almacenar como UTC)". Al revés de
como pensaba, al presuponer que estaba como False. Me sorprende que
por defecto venga como "False" si no está definido, y como "True" en
la plantilla que ellos mismos distribuyen. Es contradictorio.

Eso no cambia que esté mal acceder a la propiedad "hour", porque
justamente viene habilitado en el settings. Pero bueno.

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: cont...@nekmo.com
XMPP/Jabber: cont...@nekmo.com
Google+: Nekmo Com


Reply all
Reply to author
Forward
0 new messages