openerp.fields.Datetime.now() con la hora local

2,637 views
Skip to first unread message

Eduardo BP

unread,
May 24, 2015, 6:45:51 PM5/24/15
to openerp-s...@googlegroups.com
Hola desarrolladores de Odoo,

me gustaría saber porque la función "openerp.fields.Datetime.now()" me devuelve una fecha con la hora en UTC, no la hora en España.
Es decir, si ejecuto esta función a las 00.41:28, me devuelve este string '2015-05-24 22:41:28'.
La hora no es las 00:41:28 si no 2 horas menos, es decir, la hora en UTC.

Si voy al código fuente de la función openerp.fields.Datetime.now() me encuentro con lo siguiente:

class Datetime(Field):
type = 'datetime'

@staticmethod
def now(*args):
""" Return the current day and time in the format expected by the ORM.
This function may be used to compute default values.
"""
return datetime.now().strftime(DATETIME_FORMAT)

la función now de Odoo usa la función datetime.now() del módulo datetime de Python. Esta función ejecutada fuera de Odoo (en una shell Python por ejemplo) me devuelve la hora según la zona donde esté, en este caso España. ¿Por qué Odoo no respeta esto si usa la misma función now() de datetime?.

¿Por qué en Odoo no sucede lo mismo al usar la función "openerp.fields.Datetime.now()"?.

Gracias.

Pedro Manuel Baeza Romero

unread,
May 25, 2015, 2:15:52 AM5/25/15
to openerp-s...@googlegroups.com
Buenas, Eduardo,

Eso es así porque Odoo trabaja siempre con UTC, y es cuando se muestra en interfaz cuando se convierte a la zona de tiempo correspondiente del usuario. Tal vez tu problema es que no tienes configurada esa zona.

De todas formas, existe una función, openerp.fields.Datetime.context_timestamp() que permite devolverlo en la zona de tiempo que quieras, pero eso sólo se debe usar en casos excepcionales como exportación a archivos y demás, en los que está justificado el cambiar la zona de tiempo.

Un saludo.

Un saludo.

--
Has recibido este mensaje porque estás suscrito al grupo "Usuarios Odoo / OpenERP en España" 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 openerp-spain-u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Eduardo BP

unread,
May 25, 2015, 7:11:07 AM5/25/15
to openerp-s...@googlegroups.com
Gracias por tu respuesta Pedro.

En la interfaz gráfica de Odoo sí muestra la hora correctamente.
La cuestión es que las pruebas las estaba realizando desde la shell interactiva de Odoo (odoo.py shell), no desde la interfaz gráfica.

Me imagino entonces que en la base de datos la fecha se almacena en UTC, y la conversión a local se hace en JavaScript de lado del cliente.

Lo raro es que si probais la shell de Odoo, invocable con el comando "./odoo.py shell -d <nombre_base_datos> --addons-path <rutas addons>", y ejecutais la simple llamada a la función now() de Python (no la de Odoo):

from datetime import datetime
datetime.now()

lo que ocurre es que muestra la hora en UTC, lo cual no es lógico, porque si se ejecuta esta función en una shell de Python la hora es local.
Algo tiene que hacer el ORM de Odoo, para modificar datetime.now().

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/openerp-spain-users/injrzsbF3c8/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a openerp-spain-u...@googlegroups.com.

Pedro Manuel Baeza Romero

unread,
May 25, 2015, 7:17:18 AM5/25/15
to openerp-s...@googlegroups.com
Hay una variable de entorno para establecer la zona horaria:

export TZ=time-zone-name

y cada shell puede poner la suya. Ahí está la diferencia. Odoo siempre la pone a UTC, sea desde el shell o desde el daemon.

Un saludo.

Eduardo BP

unread,
May 25, 2015, 7:39:06 AM5/25/15
to openerp-s...@googlegroups.com
TZ="Europe/Madrid"
export TZ

Esto funciona desde una shell Bash de UNIX pero no desde la shell de Odoo, sí no he hecho algo mal.

En cambio, haciendo pruebas en la shell de Odoo, he visto que se puede usar la función "openerp.datetime.fields.now()" pasando como argumento el time zone, lo cual, hace que la hora sea local.

import pytz

tz = pytz.timezone('Europe/Madrid')
fields.datetime.now(tz)

Salida: datetime.datetime(2015, 5, 25, 13, 32, 47, 125803, tzinfo=<DstTzInfo 'Europe/Madrid' CEST+2:00:00 DST>)

La función now(timezone) de Odoo del módulo "openerp.datetime.fields" sí permite usar un timezone como argumento y devuelve un objeto de tipo datetime.

En cambio, la función now() de Odoo del módulo "openerp.Datetime.fields" (el cambio es Datetime con D mayúscula), que devuelve la fecha como un string, no tiene en cuenta el timezone que se le pasa como parámetro y, por tanto, muestra la hora en UTC.
Reply all
Reply to author
Forward
0 new messages