Node.js中修改日期小时后date.getDate()返回错误日期的解决方法
解决Date对象修改小时后日期获取错误的问题
这个坑我之前踩过!核心问题是你混淆了UTC时间和本地时区时间的操作方法,或者说用了不够稳妥的日期修改方式。
问题根源分析
你看到的控制台输出2018-05-30T00:17:04.888Z是UTC标准时间(带Z后缀),但getHours()、setHours()、getDate()这些方法都是基于你的本地时区来工作的。
举个实际场景:假设你的本地时区是UTC-5(比如美国东部时间),那么new Date()对应的本地时间其实是2018-05-29 19:17:04。当你调用x.setHours(x.getHours() +24),本地时间变成了2018-05-30 19:17:04,对应的UTC时间确实是2018-05-31T00:17:04.888Z——这时候UTC日期是31,但本地日期还是30,所以你调用x.getDate()返回30就完全正常,只是你把UTC日期当成了本地日期的预期值而已。
另外还有个隐藏坑:如果你的地区有夏令时切换,一天可能不是严格的24小时(比如变成23或25小时),这时候用setHours(+24)可能不会正确切换日期。
两种可靠的解决方案
方案1:直接操作日期(推荐,适配夏令时)
如果你只是想给日期加一天,别用加24小时的方式,直接调用setDate()修改日期:
let x = new Date(); // 2018-05-30T00:17:04.888Z x.setDate(x.getDate() + 1); // 直接加1天 console.log(x.getDate()); // 本地日期正确加1 console.log(x.toUTCString()); // 对应的UTC时间也会正确更新
方案2:统一用UTC方法操作
如果你就是想基于UTC时间来加24小时,那就全程使用UTC系列方法,避免时区混淆:
let x = new Date(); // 2018-05-30T00:17:04.888Z x.setUTCHours(x.getUTCHours() + 24); // 基于UTC加24小时 console.log(x.getUTCDate()); // 获取UTC日期,返回31,符合你的预期
验证小技巧
以后验证日期时,别只看控制台的UTC输出,用这两个方法区分时间:
x.toLocaleString():输出本地时区的完整时间,方便你核对本地日期和小时x.toUTCString():输出UTC标准时间,对应控制台的Z后缀格式
内容的提问来源于stack exchange,提问作者sudodev
相关产品推荐
相关产品推荐

