Skip to main content

Command Palette

Search for a command to run...

Trabajando con fechas en Odoo

Published
0 min read
Trabajando con fechas en Odoo

Función para convertir la fecha y hora en datetime:

# Retorna tipo datetime (UTC)
fields.Datetime.from_string(picking_id.date_done)
# <class 'datetime.datetime'>
2019-06-06 23:08:14

Función para convertir la fecha en cadena a date:

# Retorna tipo date
fields.Date.from_string(picking_id.date)
# <class 'datetime.date'>
2019-06-06

Obtiene la fecha y hora según la configuración de la zona horaria del usuario

# Retorna tipo datetime (UTC-5)
fields.Datetime.context_timestamp(self, fields.Datetime.from_string(i.date_done))
# <class 'datetime.datetime'>
2019-06-06 18:08:14-05:00

Obtener la fecha por defecto según mi zona horaria (Ejemplo: si llamaria a esa función más de las 7:00 pm, me retornaria la fecha con el día siguiente)

# Retorna tipo cadena
fields.Date.today()
# <class 'str'>
"2019-06-07"

Considerando el tz de la configuración del usuario

# Retorna tipo cadena
fields.Date.context_today(self)
# <class 'str'>
"2019-06-07"

Obtiene la fecha y hora por defecto

# Retorna tipo cadena
fields.Datetime.now()
# <class 'str'>
"2019-06-07 05:18:22"

Función convierte la fecha y hora en cadena:

# Retorna cadena
fields.Datetime.to_string(2019-06-06 18:08:14-05:00)
# <class 'str'>
# "2019-06-06 18:08:14"

Obtener los días de una diferencia de fechas:

expired = fields.Date.from_string(item.expired_date) - fields.Date.from_string(fields.Date.context_today(self))
expired.days
# 5

Sumar días, semanas, meses a una fecha determinada:

from dateutil.relativedelta import relativedelta
# Suma 5 días
expired_date = fields.Datetime.from_string(item.delivery) + relativedelta(days=5)
# Suma 2 semanas
expired_date = fields.Datetime.from_string(item.delivery) + relativedelta(days=7 * 2)
# Suma 3 meses
expired_date = fields.Datetime.from_string(item.delivery) + relativedelta(months=3)

Inverso timezone:

import pytz
tz = pytz.timezone(self.env.user.tz) if self.env.user.tz else pytz.utc
# Obtiene la fecha tal cual esta en la base de datos
check_in_end_date = fields.Datetime.from_string(i.date_done)
2019-06-06 23:08:14
# Inverse datetime time zone
# Suma la zona horaria a la fecha y hora
check_in_end_date = tz.localize(check_in_end_date).astimezone(pytz.utc)
2019-06-07 04:08:14+00:00

Obtener solo la fecha de un datetime

dt = "2019-06-06 23:08:14"
date = fields.Datetime.to_string(fields.Datetime.context_timestamp(self, fields.Datetime.from_string(dt)))[:10]
print(date)
"2019-06-06"

Otra forma de convertir la fecha y hora a nuestra zona horaria:

import pytz
from datetime import datetime
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT

dt = 2019-06-06 23:08:14
user_tz = pytz.timezone(self.env.context.get('tz') or self.env.user.tz or 'UTC')
date_tz = pytz.UTC.localize(datetime.strptime(dt, DEFAULT_SERVER_DATETIME_FORMAT)).astimezone(user_tz)

print(date_tz)
# <class 'datetime.datetime'>
2019-06-06 18:08:14-05:00

Formato por defecto de fecha y hora:

from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
"%Y-%m-%d %H:%M:%S"
"%Y-%m-%d"

Convertir al formato según tu idioma o lenguaje:

from datetime import datetime
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT

# date = '2019-06-06'
# record_lang.date_format = '%d/%m/%Y'
lang = self._context.get("lang")
record_lang = self.env["res.lang"].search([("code", "=", lang)], limit=1)
format_date = datetime.strptime(date, DEFAULT_SERVER_DATE_FORMAT).strftime(record_lang.date_format)

# Salida
print(format_date)
'06/06/2019'
8.6K views
J

Gracias por el tutorial 👍😁 me ha sido de mucha ayuda. Me estaba volviendo loco para pasar un string a datetime con la zona horaria.