计算距零点剩余时间报错midnight.getTime is not a function
错误原因
setHours()方法执行后返回值是对应时间的毫秒级时间戳,为数字类型,不是Date实例。将该返回值直接赋值给midnight后,对数字类型调用getTime()方法会触发类型错误,因为数字原型上不存在该方法。- 原有逻辑存在计算偏差:
setHours(0,0,0,0)拿到的是当日已经过去的0点时间,直接用该时间戳减当前时间会得到负数,即使修复类型错误,计算结果也不符合预期。
修复方案
根据时长计算的常见场景,提供两种可直接运行的实现:
场景1:计算当日0点到当前时间已经过去的时长
// 先创建Date实例,再设置时分秒为0,保留Date对象类型 const midnight = new Date() midnight.setHours(0, 0, 0, 0) const passedMs = Date.now() - midnight.getTime() const timePassed = new Date(passedMs) console.log(`${timePassed.getHours()}:${timePassed.getMinutes()}:${timePassed.getSeconds()}`)
场景2:计算当前时间到次日0点的剩余时长(即当日结束倒计时,匹配“剩余时长”的通用需求)
注意不要直接用时间差生成Date实例读取时分秒,该方式会受运行环境时区影响产生偏差,直接基于毫秒数换算结果更稳定:
const midnight = new Date() midnight.setHours(0, 0, 0, 0) // 当日0点加24小时毫秒数得到次日0点,计算和当前时间的差值 const remainMs = midnight.getTime() + 24 * 60 * 60 * 1000 - Date.now() // 毫秒换算为时分秒 const hours = Math.floor(remainMs / (1000 * 60 * 60)) const minutes = Math.floor((remainMs % (1000 * 60 * 60)) / (1000 * 60)) const seconds = Math.floor((remainMs % (1000 * 60)) / 1000) // 个位数补0格式化 const pad = num => num.toString().padStart(2, '0') console.log(`${pad(hours)}:${pad(minutes)}:${pad(seconds)}`)
内容的提问来源于stack exchange,提问作者Tohru
相关产品推荐
相关产品推荐

