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

Mongoose存储Date类型返回1970年日期问题及格式解决方案咨询

问题原因说明

你当前的存储结果异常核心原因是类型转换逻辑和预期不符:

  • Mongoose中定义为Date类型的字段,接收到数字类型入参时,会默认把这个数字当做Unix纪元(1970-01-01 00:00:00 UTC)起算的毫秒数做转换,而非你预期的小时数。你传入的7、22会被直接解析为纪元后7毫秒、22毫秒的时间点,自然会得到1970年开头的存储结果。
  • 存储结果里的007、022是时间值的毫秒部分,正好对应你传入的数字7、22;后缀+00:00是时区偏移标识,代表该时间采用UTC零时区标准时间,无时区偏移。
修复方案

根据你的业务需求二选一即可:

方案1:仅存储周几+时段(无具体年月日绑定)

如果你的可用时间是固定周度规则(比如每周一7点到22点可用),不需要绑定具体年月日,完全没必要用Date类型存时段,直接把字段改成数字类型即可,逻辑更简单,也不会触发时间转换问题:

availability: [
    {
        day: {
            type: String,
            // 可选:加枚举限制合法的星期值,避免脏数据
            enum: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
        },
        startTime: {
            type: Number,
            min: 0,
            max: 23 // 限制小时取值范围0-23
        },
        endTime: {
            type: Number,
            min: 0,
            max: 23
        },
    },
]

这种方式直接存7、22的小时数值,业务侧读取后直接使用即可。

方案2:存储绑定具体年月日的完整时间点

如果需要存储指定日期的具体时间(比如2024-06-15 07:00:00这种带年月日的时间),不要直接把小时数字传给Date字段,先在接口逻辑层把数字和对应的日期拼接成合法的Date对象再存入:

// 示例:拼接指定日期的7点整时间
const targetDate = new Date(用户传入的指定日期); // 比如传入'2024-06-15'
targetDate.setHours(startTime, 0, 0, 0); // 依次设置时、分、秒、毫秒,这里startTime是传入的数字7
// 拼接完成的targetDate再存入startTime字段即可
关于是否需要使用moment库
  • 仅处理当前场景的时间转换,原生JavaScript的DateAPI完全可以满足需求,不需要额外引入moment。
  • 如果后续业务存在大量复杂的日期格式化、跨时区转换、日期差值计算逻辑,可以根据需求选择合适的日期处理库,当前场景没有引入moment的必要。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:48:21