如何在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类型的逻辑处理能力。
具体实现步骤
- 配置数据库字段为DATE类型
先确保实体字段映射到PostgreSQL的date类型,避免存储时间戳:
// 手动设置日期字段 @Column({ type: 'date' }) encoded_date: Date; // 自动生成创建日期的场景 @CreateDateColumn({ type: 'date' }) encoded_date: Date;
- 用@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)))
- 手动插入时的格式处理
如果使用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
相关产品推荐
相关产品推荐

