如何使用moment.js获取今日零点时间 查询大于今日零点的数据库记录
问题原因
你之前的原生写法得到不符合预期的结果,是因为setHours是按照运行环境的本地时区设置时分秒,而你输出的带Z后缀的ISO字符串是UTC时区的时间,两者存在时区偏移,所以显示结果和预期不符。
解决方案
方案1:使用Moment.js(当前项目已引入Moment时优先用)
- 要获取本地时区的今日零点,直接调用
startOf('day')即可:
// 本地时区今日零点的Date对象 var dateTime = moment().startOf('day').toDate(); // 如果需要直接格式化和数据库匹配的时间字符串 var dateTimeStr = moment().startOf('day').format('YYYY-MM-DD HH:mm:ss');
- 要获取UTC时区的今日零点,对应加
utc()调用:
var dateTimeUTC = moment.utc().startOf('day').toDate();
方案2:纯原生JS实现
- 如果你需要的是本地时区的今日零点,原有逻辑没问题,查询数据库时优先用时间戳比对即可避免时区显示干扰:
// 本地时区今日零点 const todayStart = new Date(); todayStart.setHours(0, 0, 0, 0); // 取时间戳和数据库字段的时间戳比对,不会有时区问题 const todayStartTimeStamp = todayStart.getTime();
- 如果你需要的是UTC时区的今日零点,用UTC相关方法设置:
const todayUTCStart = new Date(); todayUTCStart.setUTCHours(0, 0, 0, 0); // 输出ISO字符串即为UTC零点格式 console.log(todayUTCStart.toISOString()) // 示例输出:2024-05-20T00:00:00.000Z
注意:和数据库比对时请先确认数据库存储的时间字段是本地时区还是UTC时区,保持查询时的时区和数据库一致即可避免时间匹配错误。
内容的提问来源于stack exchange,提问作者Harsha M V
相关产品推荐
相关产品推荐

