NestJS中MikroORM实体日期格式转换为指定格式的方法
解决MikroORM实体日期格式转换存储问题
根据你的需求,要把new Date()生成的ISO格式日期转成yyyy-mm-dd hh mm ss格式存入数据库,有几种实用方案:
方案一:手动格式化后赋值(简单直接)
如果你的ScrapeResult实体中date字段定义为字符串类型,直接写个工具函数格式化日期,再赋值给实体字段即可:
- 编写日期格式化工具函数:
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}`; }
- 实体字段定义(字符串类型):
import { Entity, Property } from '@mikro-orm/core'; @Entity() export class ScrapeResult { // 其他字段... @Property() date: string; }
- 赋值存储:
newScrapeResult.date = formatDate(new Date()); await em.persistAndFlush(newScrapeResult);
方案二:用MikroORM自定义类型自动转换
如果希望实体字段仍保留Date类型,但存入数据库时自动转成目标格式,可以自定义一个字段类型:
- 实现自定义日期类型:
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)'; } }
- 在实体中使用自定义类型:
import { Entity, Property } from '@mikro-orm/core'; import { FormattedDateType } from './FormattedDateType'; @Entity() export class ScrapeResult { // 其他字段... @Property({ type: FormattedDateType }) date: Date; }
- 正常赋值即可,MikroORM会自动处理转换:
newScrapeResult.date = new Date(); await em.persistAndFlush(newScrapeResult);
注意事项
- 时区:如果需要统一用UTC时间,把工具函数里的
getFullYear()、getMonth()等换成getUTCFullYear()、getUTCMonth()等,避免时区差异导致的日期偏差。 - 数据库字段类型:如果选择存字符串,确保数据库字段长度足够(比如
varchar(20));如果想存日期类型(如MySQL的DATETIME),其实不需要转换格式,MikroORM会自动映射Date对象,读取后再按需格式化即可。
内容的提问来源于stack exchange,提问作者theplaceofburak
相关产品推荐
相关产品推荐

