Moment.js中moment(to).toDate()返回日期提前一天问题咨询
问题原因及解决办法
为什么日期会提前一天?
这是时区差异导致的:
- moment默认会用你的本地时区解析日期字符串(比如你选的10-25-2021,若本地时区是UTC-5,对应的就是本地时间2021-10-25 00:00:00)。
- 调用
toDate()后返回的是UTC标准时间的Date对象,本地时间2021-10-25 00:00:00转成UTC就是2021-10-24 21:00:00,所以输出的Date对象显示的UTC时间看起来比预期早了一天。 - 另外如果日期字符串格式不明确(比如
10-25-2021可能被误解为日-月-年),也可能导致解析错误,但你这个例子里核心问题是时区。
解决办法
1. 强制用UTC时区解析日期
给moment加上utc()方法并指定解析格式,确保转成Date后是UTC当天的0点:
// 假设日期选择器返回的是MM-DD-YYYY格式,可根据实际格式调整第二个参数 let _from = moment.utc(from, 'MM-DD-YYYY').toDate(); let _to = moment.utc(to, 'MM-DD-YYYY').toDate(); db.collection("Users").find({ 'from': {$eq: _from }, 'to': {$eq: _to } })
这样转出来的Date对象就是2021-10-25T00:00:00.000Z,和MongoDB默认存储的UTC时间完全匹配。
2. 统一MongoDB的存储和查询时区
MongoDB默认存储UTC时间,所以不管前端用什么时区,后端统一转成UTC处理是最稳妥的方式,能避免后续出现各种时区相关问题。
3. 直接生成MongoDB兼容的ISODate
如果不想用moment转Date,也可以直接生成ISODate格式的字符串给MongoDB查询:
db.collection("Users").find({ 'from': new Date(moment.utc(from, 'MM-DD-YYYY').toISOString()), 'to': new Date(moment.utc(to, 'MM-DD-YYYY').toISOString()) })
内容的提问来源于stack exchange,提问作者user20231084
相关产品推荐
相关产品推荐

