如何使用Moment.js获取当日及次日的开始与结束时间?
解决Moment.js获取当天/次日开始结束时间的时区问题
嘿,我注意到你在用Moment.js获取当天的开始和结束时间时,输出结果和预期有偏差——比如本地当天的开始时间转成ISO格式后变成了前一天的23:00,这其实是时区转换在搞鬼,咱们来把它捋清楚,再给出你需要的当天、次日时间的正确写法~
问题根源
你的代码里now.startOf('day')确实已经把时间设置为本地时区的当天零点,但toISOString()方法会将时间转换为UTC(协调世界时)格式输出。如果你的本地时区比UTC早1小时(比如UTC+1时区),那本地零点对应的UTC时间就是前一天的23:00,这就是你看到的输出结果啦。
正确实现方式
根据你的需求,分两种场景给出代码:
1. 获取本地时区的当天/次日时间
如果你需要的是本地时区的时间(比如用户所在时区的当天零点),用format()方法指定输出格式即可,避免toISOString()的时区转换:
const now = moment(); // 本地当前时间 console.log('本地当前时间:', now.format('YYYY-MM-DD HH:mm:ss')); // 本地当天开始时间(零点) console.log('本地当天开始:', now.startOf('day').format('YYYY-MM-DD HH:mm:ss')); // 本地当天结束时间(23:59:59.999) console.log('本地当天结束:', now.endOf('day').format('YYYY-MM-DD HH:mm:ss')); // 本地次日的开始/结束时间 const tomorrowLocal = moment().add(1, 'day'); console.log('本地次日开始:', tomorrowLocal.startOf('day').format('YYYY-MM-DD HH:mm:ss')); console.log('本地次日结束:', tomorrowLocal.endOf('day').format('YYYY-MM-DD HH:mm:ss'));
2. 获取UTC时区的当天/次日时间
如果你的业务需要统一使用UTC时区(比如服务器存储时间),可以直接用moment.utc()初始化,再进行操作:
const nowUTC = moment.utc(); // UTC当前时间(ISO格式) console.log('UTC当前时间:', nowUTC.toISOString()); // UTC当天开始时间 console.log('UTC当天开始:', nowUTC.startOf('day').toISOString()); // UTC当天结束时间 console.log('UTC当天结束:', nowUTC.endOf('day').toISOString()); // UTC次日的开始/结束时间 const tomorrowUTC = moment.utc().add(1, 'day'); console.log('UTC次日开始:', tomorrowUTC.startOf('day').toISOString()); console.log('UTC次日结束:', tomorrowUTC.endOf('day').toISOString());
小提示
Moment.js的startOf()和endOf()方法都是基于当前moment对象的时区计算的,所以如果你的项目涉及多时区场景,建议全程统一使用UTC时区处理,避免出现时间混乱的问题。
内容的提问来源于stack exchange,提问作者WoJ
相关产品推荐
相关产品推荐

