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

Sequelize如何将日期格式化为YYYY-MM-DD HH:mm:ss且时间戳字段保持蛇形命名

问题原因

你遇到的报错是因为Sequelize的define方法第三个参数(模型全局配置项)中的createdAt/updatedAt属性仅支持布尔值(控制是否启用该时间字段)或字符串(自定义模型层面的字段名),不支持直接传入字段配置对象,你的字段配置放错了位置。

正确实现方案

1. 调整字段配置位置

将createdAt、updatedAt的字段定义移到第二个参数(表字段定义对象)中,第三个参数仅保留全局配置即可。如果需要自动将驼峰字段映射为蛇形数据库列,可以开启underscored: true,无需手动指定field属性。

2. 秒级时间存储实现

不需要手动写setter处理毫秒去除,直接将DATE类型的精度设置为0即可,Postgres会自动存储为YYYY-MM-DD HH:mm:ss格式,不会带毫秒部分。

3. 完整正确代码

const Supplier = sequelize.define('Supplier', {
  id: {
    type: DataTypes.UUID,
    defaultValue: DataTypes.UUIDV4,
    allowNull: false,
    primaryKey: true
  },
  name: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
    validate: {
      len: [1, 50]
    }
  },
  description: {
    type: DataTypes.STRING,
    allowNull: true,
  },
  // 时间字段移到此处定义
  createdAt: {
    type: DataTypes.DATE(0), // 精度0表示秒级,自动去掉毫秒
    allowNull: false,
    defaultValue: sequelize.NOW,
    // 若不开启underscored自动映射,手动添加 field: 'created_at' 即可
    get() {
      // 若需要查询返回时直接是格式化后的字符串,保留这个getter,不需要可以删掉
      return this.getDataValue('createdAt').toISOString().replace(/\..+/g, '').replace('T', ' ');
    }
  },
  updatedAt: {
    type: DataTypes.DATE(0),
    allowNull: false,
    defaultValue: sequelize.NOW,
    get() {
      return this.getDataValue('updatedAt').toISOString().replace(/\..+/g, '').replace('T', ' ');
    }
  }
}, {
  tableName: 'suppliers',
  timestamps: true,
  underscored: true, // 开启后自动将驼峰字段映射为蛇形数据库列,createdAt自动对应created_at
  // freezeTableName: true
  // paranoid: true
});

补充说明

如果不需要查询时自动返回格式化字符串,删掉字段里的get方法即可,数据库存储的本身就是秒级时间格式,你可以在业务代码里按需处理转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:36:05