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'

