You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Odoo模块中将日期转换为指定格式的字符串?

Odoo自动日期字段转yyyymmddhhmmss格式计算字段解决方案

刚接触Odoo的话,处理日期格式转换其实挺直观的,我帮你拆解一下步骤,直接上代码和解释:

1. 先搞定自动填充的日期字段

首先要注意:如果你的需求是要包含时分秒的格式,建议用Datetime类型字段(Date类型只有年月日,转出来的时分秒会是000000)。自动填充可以直接用Odoo内置的默认值:

from odoo import models, fields, api

class YourModel(models.Model):
    _name = 'your.model.name'  # 替换成你的实际模型名
    _description = 'Your Model Description'

    # 自动填充当前日期时间的字段
    auto_datetime = fields.Datetime(
        string='自动日期时间',
        default=fields.Datetime.now,  # 自动填充当前UTC时间
        required=True
    )

如果确实只需要纯日期(不带时分秒),可以改成:

auto_date = fields.Date(
    string='自动日期',
    default=fields.Date.today,
    required=True
)

2. 添加计算字段转换格式

接下来定义一个计算字段,把上面的日期/时间转成yyyymmddhhmmss格式的字符串。这里用Char类型就足够了:

针对Datetime字段的情况

# 格式化后的日期字段(可选store=True将结果存到数据库)
formatted_datetime = fields.Char(
    string='格式化日期时间',
    compute='_compute_formatted_datetime',
    store=True  # 若需持久化到数据库则开启,否则每次访问实时计算
)

@api.depends('auto_datetime')  # 依赖自动日期字段,字段变化时自动重新计算
def _compute_formatted_datetime(self):
    for record in self:
        if record.auto_datetime:
            # 用strftime把datetime对象转成指定格式
            # %Y=4位年, %m=2位月, %d=2位日, %H=24小时制, %M=分, %S=秒
            record.formatted_datetime = record.auto_datetime.strftime('%Y%m%d%H%M%S')
        else:
            record.formatted_datetime = False

针对Date字段的情况

如果用的是Date类型,需要先把它转成Datetime对象再格式化(时分秒会默认是000000):

formatted_date = fields.Char(
    string='格式化日期',
    compute='_compute_formatted_date',
    store=True
)

@api.depends('auto_date')
def _compute_formatted_date(self):
    for record in self:
        if record.auto_date:
            # 把Date转成Datetime对象
            dt = fields.Datetime.from_string(record.auto_date)
            record.formatted_date = dt.strftime('%Y%m%d%H%M%S')
        else:
            record.formatted_date = False

3. 额外注意点

  • 时区问题:Odoo默认存储的是UTC时间,如果需要转换为当前用户的时区时间再格式化,可以用context_timestamp:
    local_dt = fields.Datetime.context_timestamp(self, record.auto_datetime)
    record.formatted_datetime = local_dt.strftime('%Y%m%d%H%M%S')
    
  • store=True的作用:开启后计算结果会存在数据库里,适合需要频繁查询或报表使用的场景;关闭则每次访问实时计算,节省存储但略耗性能。

内容的提问来源于stack exchange,提问作者TheRedosan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:38:36