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

如何在NestJS+TypeORM+PostgreSQL中保持Date类型并以dd/mm/yyyy格式操作日期?

问题

我需要以dd/mm/yyyy格式插入日期,以匹配应用中的其他技术栈。目前使用NestJS、TypeORM和PostgreSQL作为数据库。

我尝试按照文档使用@Transform装饰器:

@Transform(({ value }) => moment(value).format('DD/MM/YYYY'))
@Column()
encoded_date: Date;

但它始终插入并返回时间戳。是否可以实现类似SQL脚本中to_date('25/02/2023', 'DD/MM/YYYY')::date的效果,同时保持Date类型?


我还尝试了以下代码,得到的是yyyy-mm-dd格式,无法转为dd/mm/yyyy:

@CreateDateColumn({type:'date'})
encoded_date: Date;
解决方案

核心思路

PostgreSQL的date类型默认以yyyy-mm-dd作为标准存储格式(无法直接修改),我们需要通过TypeORM字段配置控制存储类型,再结合class-transformer的@Transform处理前后端的格式转换,同时保留Date类型的逻辑处理能力。

具体实现步骤

  1. 配置数据库字段为DATE类型
    先确保实体字段映射到PostgreSQL的date类型,避免存储时间戳:
// 手动设置日期字段
@Column({ type: 'date' })
encoded_date: Date;

// 自动生成创建日期的场景
@CreateDateColumn({ type: 'date' })
encoded_date: Date;
  1. 用@Transform处理双向格式转换
    调整@Transform的逻辑,同时处理前端输入(字符串转Date)和后端输出(Date转字符串):
import { Transform } from 'class-transformer';
import moment from 'moment';

// 实体字段完整配置
@Column({ type: 'date' })
@Transform(({ value }) => {
  // 输出到前端:把Date对象转为dd/mm/yyyy格式字符串
  if (value instanceof Date) {
    return moment(value).format('DD/MM/YYYY');
  }
  // 接收前端输入:把dd/mm/yyyy格式字符串转为Date对象
  return moment(value, 'DD/MM/YYYY').toDate();
})
encoded_date: Date;

注意:需要确保NestJS启用了自动序列化,在main.ts中配置app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)))

  1. 手动插入时的格式处理
    如果使用QueryBuilder手动插入数据,需要自行转换格式:
await this.yourEntityRepository.createQueryBuilder()
  .insert()
  .into(YourEntity)
  .values({
    encoded_date: moment('25/02/2023', 'DD/MM/YYYY').toDate()
  })
  .execute();

关键说明

  • 数据库的存储格式无需修改,业务层面的格式转换放在应用层完成即可
  • 保持Date类型可以让你在业务逻辑中正常使用日期相关的操作(比如比较、计算),同时对外暴露统一的dd/mm/yyyy格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:05:29