如何在TypeORM中将默认日期格式修改为dd/mm/yyyy格式?
问题根因
你当前使用的@Transform是class-transformer提供的注解,仅作用于接口请求、响应阶段的对象序列化/反序列化环节,不会影响TypeORM对数据库字段的读写逻辑,因此入库和查询返回时仍然走Date类型的默认格式。另外你现有代码的@Transform回调参数使用错误,拿到的是完整的转换上下文对象而非日期值,也是转换不生效的原因之一。
解决方案
方案1:数据库存储原生DATE类型(推荐,方便后续做日期查询、计算)
通过TypeORM的@Column配置的transformer属性,控制数据库读写阶段的日期转换,配合修正后的@Transform注解实现全链路格式统一:
- 先定义通用的日期转换器
import * as moment from 'moment'; const dateTransformer = { // 入库前转换:将传入的dd/mm/yyyy字符串转成数据库可识别的Date类型 to: (value: string | Date): Date => { if (typeof value === 'string') { return moment(value, 'DD/MM/YYYY').toDate(); } return value; }, // 出库后转换:将数据库返回的Date类型转成dd/mm/yyyy格式字符串 from: (value: Date): string => { return moment(value).format('DD/MM/YYYY'); } }
- 修正实体类代码
@Entity() export class EntityClass { @Transform(({ value }) => moment(value).format('DD/MM/YYYY')) @Column({ type: 'date', // 根据实际使用的数据库调整字段类型,MySQL/PostgreSQL均支持date类型 transformer: dateTransformer }) public startDate: Date | string; @Transform(({ value }) => moment(value).format('DD/MM/YYYY')) @Column({ type: 'date', transformer: dateTransformer }) public endDate: Date | string; }
- 若使用NestJS框架,需确保全局开启class-transformer自动序列化,在
main.ts中添加配置:
import { ClassSerializerInterceptor, Reflector } from '@nestjs/core'; // 其他启动代码... app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
方案2:数据库直接存储dd/mm/yyyy格式字符串
如果不需要基于日期字段做数据库层面的计算、查询,也可以直接将字段设为字符串类型存储,调整转换器逻辑即可:
const dateTransformer = { to: (value: string | Date): string => { if (value instanceof Date) { return moment(value).format('DD/MM/YYYY'); } return value; }, from: (value: string): string => value } // 实体类@Column调整为 @Column({ type: 'varchar', length: 10, transformer: dateTransformer })
内容的提问来源于stack exchange,提问作者Tara
相关产品推荐
相关产品推荐

