如何使用Dayjs设置Mongoose Schema中createdAt的时区(UTC+9)
解决Mongoose中用Dayjs设置UTC+9时区createdAt默认值的问题
你的代码存在几个关键问题导致默认值不生效,具体修正方案如下:
问题分析
- 默认值计算时机错误:直接写
dayjs().tz('Asia/Seoul').format()会在Schema定义时生成固定值,而非每次创建文档时动态计算当前时间。 - 类型不匹配:
format()返回字符串,但createdAt字段类型是Date,Mongoose无法将字符串正确解析为Date类型,导致默认值失效。 - 时区设置未生效:
dayjs().tz('Asia/Seoul')仅创建了一个临时实例,既没设置全局时区,也未在默认值逻辑中复用。 - 细节拼写错误:
require应为required,模型名Commenet应为Comment,这些小错误也会影响代码正常运行。
修正后的代码
import { Schema, model, Types } from 'mongoose'; import dayjs from 'dayjs'; import timezone from 'dayjs/plugin/timezone'; import utc from 'dayjs/plugin/utc'; // 加载Dayjs所需插件 dayjs.extend(utc); dayjs.extend(timezone); // 可选:设置全局默认时区,后续无需每次手动指定 dayjs.tz.setDefault('Asia/Seoul'); const commentSchema = new Schema({ commenter: { type: Types.ObjectId, required: true, ref: 'User', }, createdAt: { type: Date, // 用函数返回动态时间,确保每次创建文档时计算当前时间 default: () => dayjs().tz('Asia/Seoul').toDate(), // 若已设置全局时区,可简化为:default: () => dayjs().toDate() }, }); // 修正模型名拼写 const Comment = model('Comment', commentSchema); export default Comment;
关键说明
- 函数式默认值:Mongoose会在每次创建文档时调用该函数,保证获取的是实时时间。
- 类型转换:通过
toDate()将Dayjs实例转为原生Date对象,匹配Mongoose的Date字段类型要求。 - 全局时区配置:
dayjs.tz.setDefault('Asia/Seoul')设置后,后续dayjs()会自动使用UTC+9时区,简化代码。
内容的提问来源于stack exchange,提问作者pvp11
相关产品推荐
相关产品推荐

