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

如何使用Dayjs设置Mongoose Schema中createdAt的时区(UTC+9)

解决Mongoose中用Dayjs设置UTC+9时区createdAt默认值的问题

你的代码存在几个关键问题导致默认值不生效,具体修正方案如下:

问题分析

  1. 默认值计算时机错误:直接写dayjs().tz('Asia/Seoul').format()会在Schema定义时生成固定值,而非每次创建文档时动态计算当前时间。
  2. 类型不匹配:format()返回字符串,但createdAt字段类型是Date,Mongoose无法将字符串正确解析为Date类型,导致默认值失效。
  3. 时区设置未生效:dayjs().tz('Asia/Seoul')仅创建了一个临时实例,既没设置全局时区,也未在默认值逻辑中复用。
  4. 细节拼写错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:05:33