写倒计时功能,同事用Date.now()减了个时间,结果页面显示一串13位数字,问我怎么转成几分几秒。他以为这个函数返回的是日期对象,直接能格式化,其实拿到的只是一个数字。

Date.now()返回的是从1970年1月1日零点到现在的毫秒数,比如1720000000000这种。它是个时间戳,不是Date对象,没有getFullYear这类方法,想格式化得先转。

时间戳和Date对象别混

new Date()拿到的是对象,能调各种get方法,也能直接toString打出可读时间。Date.now()拿到的是数字,适合做计算,比如算耗时、做倒计时、生成唯一后缀。两者用加号都能拼,但含义完全不同。

要互相转很简单。new Date(时间戳)把数字变对象,对象.getTime()把对象变数字。页面展示走对象加toLocaleString,存库和比较走数字,基本不会错。

三个高频用法和坑

  • 算耗时:前后各调一次相减,得到毫秒差,除以1000是秒
  • 倒计时:目标时间戳减Date.now(),再换算成分秒展示
  • 别当唯一ID:同一毫秒可能重复,并发高时要加随机后缀
const start = Date.now(); runTask(); const ms = Date.now() - start; const d = new Date(Date.now()); const str = d.toLocaleString(); const back = d.getTime();

这里start和ms都是数字,d是对象,str是可读字符串。back又变回数字,和Date.now()一个量级。注意浏览器和Node返回的都是毫秒,不是秒,后端有些接口要秒,记得除以1000再取整,别直接传过去差了一千倍。

精度方面,Date.now()到毫秒级,做动画帧率统计够用。真要测微小函数耗时,用performance.now(),它是小数毫秒,更细。

取舍很简单。要计算和比较就用Date.now()的数字,要展示就转Date对象。别拿数字去调格式化方法,也别拿对象直接相减,先统一成数字再算。