TIMEZONE guardar fecha local en el modelo

419 views
Skip to first unread message

Serena

unread,
Aug 31, 2015, 4:55:39 PM8/31/15
to Django-es
Hola a todos, Es la primera vez que escribo en este grupo. 
Tengo poco tiempo trabajando con django y tengo algunas dudas. La que más me urge es sobre la fecha:

Si tengo un modelo llamado Factura, y este modelo tiene un campo llamado fecha de la venta, necesito guardar la fecha de acuerdo a la zona horaria, que en mi caso:

USE_TZ = True
TIME_ZONE = 'America/Caracas'

En lugar de ello, la fecha se guarda con un desfase de 5 horas. Se que tiene que ver directamente con el TIME_ZONE pero ni idea de como hacer para que mi modelo lo guarde como la hora del cliente. Alguna idea?

Gracias de antemano por su colaboración.

Juan Vargas A.K.A RootWeiller

unread,
Aug 31, 2015, 5:17:15 PM8/31/15
to djan...@googlegroups.com
Deseas guardar la fecha en un modelo?

lo puedes hacer así

fecha = models.DateTimeField(auto_now=True)

con ello tomas la fecha del servidor y se guarda en la variable fecha.

--
--
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.



--
Juan Vargas
(58) 426 - 2795326
@RootWeiller
@Lab42Software

Emprendimientos

Blog
"Si quieres que los demás te sigan, no tienes más que ir delante de ellos" Alfonso Alcántara 

Diego Ponce de León

unread,
Aug 31, 2015, 5:23:31 PM8/31/15
to djan...@googlegroups.com
Si, django da problemas con las fechas.
Deja los settings tal cuál los tienes. Instala pytz en tu entorno de python. 
Te paso estos métodos que utilizo en varios proyectos y funcionan perfectamente:

# coding=utf-8
from django.conf import settings
from django.utils import timezone
from datetime import timedelta
import pytz


def timezone_from_settings():
""" The actual timezone from settings file """
return timezone.now().astimezone(pytz.timezone(settings.TIME_ZONE))


def tz_now():
return timezone_from_settings().now()


def tz_today():
""" Today´s date given the timezone from settings file """
return timezone_from_settings().date()


def tz_yesterday():
""" Yesterday´s date given the timezone from settings file """
return tz_today() - timedelta(days=1)


def tz_week_start():
today_date = tz_today()
return today_date - timedelta(days=today_date.weekday())


def tz_week_end():
return tz_week_start() + timedelta(days=7)

Serena

unread,
Aug 31, 2015, 5:49:43 PM8/31/15
to Django-es
Hola Diego, gracias por compartir ese codigo. Sin embargo, no es exactamente lo que busco. Las funciones que me proporcionas son eficientes, sin embargo, lo que quisiera saber realmente es como guardo en mi base de datos la fecha y la hora correcta; cuando guardo una factura en la base de datos, me guarda una fecha que tiene un desfase de 5 horas aproximadamente, es decir no es la hora local del cliente, incluso haciendo pruebas en local. Para mi es de suma importancia que la factura contenga la hora local en que fue realizada, porque cuando requiera hacer el cierre Z del día, si tengo un desfase en la fecha esa factura podría incluso haberse guardado con fecha del siguiente día y ya no contaría en el cierre Z de ese día, no sé si me explico bien.

Serena

unread,
Aug 31, 2015, 5:51:05 PM8/31/15
to Django-es
Gracias RootWeiller, sin embargo, no quiero que guarde la fecha y hora del servidor, más bien quiero que guarde la fecha y hora del cliente. Para poder efectuar las consultas adecuadamente.

monoBOT

unread,
Aug 31, 2015, 6:01:16 PM8/31/15
to djan...@googlegroups.com
​Para completar lo q comenta Juan.

debes de poner en tu settings
monoBOT
Visite mi sitio(Visit my site): monobotsoft.es/blog/

Hiko hitokiri

unread,
Aug 31, 2015, 6:07:47 PM8/31/15
to djan...@googlegroups.com
lo mas facil es hacerlo con js

Antony Petrocelli

unread,
Aug 31, 2015, 6:40:40 PM8/31/15
to djan...@googlegroups.com
Sugiero que sea el servidor el que decida la zona horaria del cliente a traves de un campo zona horaria o identificandola de alguna manera, siempre y cuando este tz vaya ser fija.

Las operaciones quer vayas hacer, la haras con la zona horaria neutra guardada, pero cuando muestres en formularios, resultados o donde sea, convertirás la hora a la hora local del cliente.

No sugiero tomar la hora local del cliente, esta puede estar desfasada.
--
Antony Petrocelli
Linuxero

Diego Ponce de León

unread,
Aug 31, 2015, 9:13:34 PM8/31/15
to djan...@googlegroups.com
El código que te he puesto es justamente para eso:

factura.fecha = timezone_from_settings().now()

--

Diego Ponce de León

unread,
Aug 31, 2015, 9:17:22 PM8/31/15
to djan...@googlegroups.com
O también puedes hacer factura.fecha = tz_now(),
De esa manera tu base de datos guardará la fecha exacta del timezone que tengas puesto en los settings.

Otra cosa que te podría confundir son los valores que se guardan en la base de datos, que pueden tener una hora distinta, pero con un número al final que define la franja horaria.
Mira siempre el valor de fecha que te devuelve django, no el que se guarda en la base de datos 

Hiko hitokiri

unread,
Aug 31, 2015, 9:50:59 PM8/31/15
to djan...@googlegroups.com
mira aqui en la documentación hacen algo parecido a lo que tu quieres
que es tomar el tz de el user

https://docs.djangoproject.com/en/1.8/topics/i18n/timezones/#selecting-the-current-time-zone

Hiko hitokiri

unread,
Aug 31, 2015, 9:52:22 PM8/31/15
to djan...@googlegroups.com

Juan Vargas A.K.A RootWeiller

unread,
Sep 1, 2015, 3:55:34 PM9/1/15
to djan...@googlegroups.com
La recomendación es que sea el servidor quien decida sobre la hora de la transacción, configúrala al país donde esta el cliente y listo.

El 31 de agosto de 2015, 21:21, Hiko hitokiri <las...@gmail.com> escribió:

--
--
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.

Serena

unread,
Sep 1, 2015, 6:02:38 PM9/1/15
to Django-es
Gracias a todos por su colaboración, hice la misma pregunta en otra lista y encontramos la solución. Adjunto url ( https://groups.google.com/forum/#!topic/django-users/1yZW5IPufwo ) para que vean la solución a mi problema. En resumen, efectivamente la forma correcta de guardar la fecha es la que tiene el servidor, lo que debía cambiar era la forma en que realizaba las consultas a la base de datos.

victor alfonso castañeda ceballos

unread,
Sep 1, 2015, 8:23:36 PM9/1/15
to djan...@googlegroups.com

Como aprendiste ingles?

--

Phoenix

unread,
Sep 2, 2015, 11:01:30 AM9/2/15
to Django-es
from django.utils import timezone

fecha = models.DateTimeField(auto_now=True, default=timezone.now())

Saludos
Reply all
Reply to author
Forward
0 new messages