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
相关产品推荐
相关产品推荐

