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

NestJS中MikroORM实体日期格式转换为指定格式的方法

解决MikroORM实体日期格式转换存储问题

根据你的需求,要把new Date()生成的ISO格式日期转成yyyy-mm-dd hh mm ss格式存入数据库,有几种实用方案:

方案一:手动格式化后赋值(简单直接)

如果你的ScrapeResult实体中date字段定义为字符串类型,直接写个工具函数格式化日期,再赋值给实体字段即可:

  1. 编写日期格式化工具函数:
function formatDate(date: Date): string {
  // 若需UTC时间,把下面的getXXX换成getUTCXXX
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  
  return `${year}-${month}-${day} ${hours} ${minutes} ${seconds}`;
}
  1. 实体字段定义(字符串类型):
import { Entity, Property } from '@mikro-orm/core';

@Entity()
export class ScrapeResult {
  // 其他字段...
  
  @Property()
  date: string;
}
  1. 赋值存储:
newScrapeResult.date = formatDate(new Date());
await em.persistAndFlush(newScrapeResult);

方案二:用MikroORM自定义类型自动转换

如果希望实体字段仍保留Date类型,但存入数据库时自动转成目标格式,可以自定义一个字段类型:

  1. 实现自定义日期类型:
import { Type } from '@mikro-orm/core';

export class FormattedDateType extends Type<string, Date> {
  // 把Date对象转成数据库存储的字符串格式
  convertToDatabaseValue(value: Date): string {
    if (!value) return '';
    // 按需切换本地/UTC时间
    const year = value.getFullYear();
    const month = String(value.getMonth() + 1).padStart(2, '0');
    const day = String(value.getDate()).padStart(2, '0');
    const hours = String(value.getHours()).padStart(2, '0');
    const minutes = String(value.getMinutes()).padStart(2, '0');
    const seconds = String(value.getSeconds()).padStart(2, '0');
    
    return `${year}-${month}-${day} ${hours} ${minutes} ${seconds}`;
  }

  // 从数据库读取字符串转回Date对象(不需要的话也可以直接返回字符串)
  convertToJSValue(value: string): Date {
    return new Date(value.replace(' ', 'T') + '.000Z');
  }

  // 指定数据库字段类型
  getColumnType() {
    return 'varchar(20)';
  }
}
  1. 在实体中使用自定义类型:
import { Entity, Property } from '@mikro-orm/core';
import { FormattedDateType } from './FormattedDateType';

@Entity()
export class ScrapeResult {
  // 其他字段...
  
  @Property({ type: FormattedDateType })
  date: Date;
}
  1. 正常赋值即可,MikroORM会自动处理转换:
newScrapeResult.date = new Date();
await em.persistAndFlush(newScrapeResult);

注意事项

  • 时区:如果需要统一用UTC时间,把工具函数里的getFullYear()、getMonth()等换成getUTCFullYear()、getUTCMonth()等,避免时区差异导致的日期偏差。
  • 数据库字段类型:如果选择存字符串,确保数据库字段长度足够(比如varchar(20));如果想存日期类型(如MySQL的DATETIME),其实不需要转换格式,MikroORM会自动映射Date对象,读取后再按需格式化即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:05:11