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

如何在TypeORM中将默认日期格式修改为dd/mm/yyyy格式?

问题根因

你当前使用的@Transform是class-transformer提供的注解,仅作用于接口请求、响应阶段的对象序列化/反序列化环节,不会影响TypeORM对数据库字段的读写逻辑,因此入库和查询返回时仍然走Date类型的默认格式。另外你现有代码的@Transform回调参数使用错误,拿到的是完整的转换上下文对象而非日期值,也是转换不生效的原因之一。

解决方案

方案1:数据库存储原生DATE类型(推荐,方便后续做日期查询、计算)

通过TypeORM的@Column配置的transformer属性,控制数据库读写阶段的日期转换,配合修正后的@Transform注解实现全链路格式统一:

  1. 先定义通用的日期转换器
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');
  }
}
  1. 修正实体类代码
@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;

}
  1. 若使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:24:04