获取时间戳在 JavaScript 中通常指的是取得从 UTC 时间 1970 年 1 月 1 日 0 点 0 分 0 秒 0 毫秒起,到当前时刻所经过的毫秒数。这个数值经常用于计时、缓存版本号、请求标识、文件命名以及前后端时间传递。JavaScript 的标准日期 API 提供了多种拿到这个毫秒数的方法,下面分别从静态方法、实例方法、valueOf 和隐式类型转换四条路线来看它们的实现细节。

Date.now():直接返回当前毫秒时间戳
Date.now() 是 ES5 引入的静态方法,调用时不需要先 new 一个 Date 实例。它直接返回一个数值,表示从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的毫秒数。如果运行环境支持,它是获取当前时间戳最直接的方式。
示例代码:
const timestamp = Date.now(); console.log(timestamp); // 例如 1716000000000 console.log(typeof timestamp); // number
这个方法非常简洁,执行过程中不创建 Date 对象,因此在性能敏感的场景中相对友好。比如在动画循环、事件节流、接口耗时统计等高频调用中,使用 Date.now() 可以降低对象创建带来的垃圾回收压力。不过需要注意,老式浏览器比如 IE8 及以下并不支持该方法,如果项目需要兼容这些环境,可以在脚本入口加入简单的 polyfill:
if (!Date.now) {
Date.now = function () {
return new Date().getTime();
};
}
除了标准时间戳,部分场景还会使用 performance.now() 来测量时间间隔。需要区分的是,performance.now() 返回的是从页面导航开始到当前时刻的高精度毫秒数,通常带小数部分,它不是相对于 1970 年的时间戳,二者不能混用。
getTime() 与 valueOf():从 Date 实例取毫秒数
如果代码里已经创建了日期对象,可以通过实例方法 getTime() 拿到时间戳。先使用 new Date() 创建代表当前时间的对象,再调用 getTime(),返回值同样是 1970 年以来的毫秒数。这种写法读起来很直观:找到一个日期对象,然后获取它的时间表示。
const now = new Date(); const timestamp = now.getTime(); console.log(timestamp); // 例如 1716000000000
valueOf() 也能得到完全相同的结果。Date 对象在需要转换成原始数值时,会调用 valueOf(),而这个方法返回的就是内部的毫秒时间戳。因此 new Date().valueOf() 与 new Date().getTime() 在数值上严格相等。区别在于 getTime() 是开发者显式调用的取值方法,语义更清楚;而 valueOf() 偏向 JavaScript 对象类型转换机制,平时直接使用的频率较低。
const a = new Date(); console.log(a.getTime() === a.valueOf()); // true
如果只是临时取一次当前时间戳,这两种方式都要先创建 Date 实例,开销比 Date.now() 略大。但如果后续还要使用这个 Date 对象做格式化、获取年、月、日等操作,那么保留对象并调用 getTime() 是合理选择。
+new Date():利用一元加号触发隐式转换
一元加号在 JavaScript 中可以把操作数强制转换为数值。当它作用在 Date 对象上时,引擎会对这个对象执行 ToNumber 抽象操作,而 Date 对象的 ToNumber 实现就是返回它的时间戳。因此 +new Date() 就成为一种极短的时间戳写法,结果与 Date.now()、getTime() 完全一致。
const timestamp = +new Date(); console.log(timestamp); // 例如 1716000000000
这种写法在早期 JavaScript 代码和许多压缩后的库中很常见,因为它字符少、不需要方法调用括号。但它依赖隐式类型转换,阅读起来不如 Date.now() 直白。如果团队里有明确代码风格,最好统一使用一种写法,避免同个项目中出现 +new Date()、Date.now()、getTime() 混用的情况。
与 +new Date() 等价的还有 Number(new Date()),本质都是调用 Date 对象的原始值转换。还有一个容易混淆的写法是 Date.parse(new Date().toString()),它虽然也能得到毫秒数,但多经历一次字符串解析,误差和性能都不稳定,不建议用来获取当前时间戳。
四种方案对比与选择建议
把四种写法放在一起比较,可以更清晰地看出它们的差异。以下表格从创建对象、可读性、兼容性和常见使用场景几个维度做了汇总。
| 写法 | 是否创建实例 | 可读性 | 备注 |
|---|---|---|---|
Date.now() | 否 | 高 | ES5 静态方法,推荐用于当前时间戳 |
new Date().getTime() | 是 | 高 | 显式从日期对象取毫秒数 |
new Date().valueOf() | 是 | 中 | 底层原始值,等价于 getTime |
+new Date() | 是 | 低 | 最简洁,依赖隐式类型转换 |
在现代 JavaScript 项目中,如果只想获取当前时间戳,优先选择 Date.now()。它不需要实例化,语义明确,性能也最好。若代码里已经持有了 Date 对象,或者需要同时使用时间对象进行展示和计算,则使用 getTime() 更自然。valueOf() 通常不需要主动调用,但在编写通用工具函数或处理日期对象运算时可以了解其作用。而 +new Date() 适合个人脚本、短小示例或对代码体积有极致要求的场景,正式项目使用前应确认团队规范和 ESLint 规则是否允许。
最后还需要注意,无论使用哪种方式,得到的时间戳都是基于当前环境的系统时间。如果客户端时间被手动调整,或者设备时区与 UTC 存在理解偏差,时间戳本身代表的是从纪元开始计算的实际时刻,不会包含时区信息,但会受系统时间准确性的影响。对于需要强一致性的服务端场景,不应只依赖浏览器端生成时间戳。
JavaScript时间戳Date.now获取当前时间戳修改时间:2026-09-19 05:41:56