JavaScript获取当前时间戳的5种常用写法

作者:木棉时间:2026-11-05 19:40:18浏览:122

深入详解JavaScript中获取当前时间戳的5种常用写法,涵盖Date.now()、+new Date()、getTime()、valueOf()与Number(new Date())的底层原理、性能对比、13位与10位转换及实际开发选型指南。

JavaScript获取当前时间戳的5种常用写法
图0:JavaScript获取当前时间戳的常用方案与特性概览
在JavaScript中,时间戳通常指自协调世界时(UTC)1970年1月1日00:00:00起经过的毫秒数。获取当前时间戳最直接、性能最优的写法是内置静态方法 Date.now()。除此以外,基于 Date 实例与类型转换机制,还有 +new Date()、new Date().getTime()、new Date().valueOf() 以及 Number(new Date()) 共5种常见写法。本文将逐一讲解这5种写法的代码实现、底层执行机制与适用场景,并说明开发中常见的高频问题——毫秒与秒级时间戳的换算。

一、JavaScript时间戳的本质与底层机制

在现代ECMAScript规范中,时间值在内部以64位浮点数表示为相对于Epoch(1970-01-01 00:00:00 UTC)的毫秒级整数。与很多后端语言(如PHP默认返回10位秒级戳)不同,JavaScript原生环境默认生成的是13位毫秒时间戳。

获取当前时间戳主要存在两条底层路径:静态方法路径与实例转换路径。静态方法无需在堆内存中创建任何包装对象,直接向底层宿主环境查询时钟;而实例转换路径则首先通过 new Date() 分配一个日期对象,再通过方法调用或类型转换协议取得内部保存的时间槽数值。

JavaScript获取当前时间戳的5种常用写法
图1:JavaScript 时间戳获取的底层流转机制与执行路径

二、写法一:Date.now() —— 现代标准首选

Date.now() 是ECMAScript 5(ES5)正式引入的静态方法。它不依赖于 Date 的任何具体实例,直接返回代表当前时刻的13位毫秒时间戳。

代码示例

const timestamp = Date.now();

console.log(timestamp); 
// 示例输出:1730345678912(具体数值取决于执行时刻)
console.log(typeof timestamp); 
// 示例输出:"number"

原理解析与适用边界

这是所有写法中最推荐的标准方案。它的最大优势在于零内存开销:执行过程中不会触发 new 操作符分配对象内存,也不会产生垃圾回收(GC)负担。在需要高频记录时间的场景(例如动画帧更新、性能埋点、请求防抖节流、批量循环计时)中,Date.now() 具有无可替代的执行效率。现存的所有现代浏览器与Node.js全版本均已原生支持。

三、写法二:+new Date() —— 经典一元加号隐式转换

在ES5普及之前,前端社区广泛使用 +new Date() 这种书写风格。它巧妙利用了一元加运算符(Unary Plus Operator)的隐式类型强制转换特性。

代码示例

const timestamp = +new Date();

console.log(timestamp); 
// 示例输出:1730345678912
console.log(typeof timestamp); 
// 示例输出:"number"

原理解析与适用边界

当一元 + 作用于对象时,JavaScript引擎内部会触发 ToNumber() 抽象操作。对于 Date 对象,引擎会首先调用其内置的 Date.prototype[Symbol.toPrimitive]('number'),进而转向 valueOf() 方法,最终得到该时间实例的原始毫秒数字。

这种写法代码极度紧凑,但在可读性上略逊于显式方法调用。部分严格的企业级代码风格指南(如ESLint的规范配置)可能会对此类依靠隐式转换的代码提出警告,建议明确意图。

四、写法三:new Date().getTime() —— 最直观的实例方法

new Date().getTime() 是JavaScript诞生初期就存在的标准实例方法,属于最经典、直观的实现方式。

代码示例

const dateInstance = new Date();
const timestamp = dateInstance.getTime();

console.log(timestamp); 
// 示例输出:1730345678912

原理解析与适用边界

Date.prototype.getTime() 直接返回日期对象内部存储的UTC时间毫秒值。虽然单次获取当前时间时创建新对象存在微小的实例化损耗,但在业务逻辑中已经持有某个 Date 对象时(例如从用户选择器解析出来的日期、或者接收到的格式化时间对象),使用 .getTime() 是最标准、最语义化的做法。

五、写法四:new Date().valueOf() —— 原型原始值方法

在JavaScript中,几乎所有内建引用类型都在原型上实现了 valueOf() 方法,用于返回该对象的原始值表示。

代码示例

const timestamp = new Date().valueOf();

console.log(timestamp); 
// 示例输出:1730345678912

原理解析与适用边界

根据ECMAScript规范定义,Date.prototype.valueOf() 在底层实现上与 Date.prototype.getTime() 功能完全等价,两者的内部算法均直接返回日期内部的时间戳槽位(Time Value)。开发中开发者通常习惯使用 getTime(),而 valueOf() 更多作为标准对象接口服务于JavaScript引擎的自动拆箱求值机制。

六、写法五:Number(new Date()) —— 显式类型包装转换

如果希望将 Date 实例显式转换为数字,除了使用运算符外,还可以直接调用 Number() 全局类型转换函数。

代码示例

const timestamp = Number(new Date());

console.log(timestamp); 
// 示例输出:1730345678912

原理解析与适用边界

Number(val) 属于显式类型转换,能够明确告知阅读代码的人员“此处正在将一个对象转换为数值”。其内部转换规则与一元 + 完全一致,均走标准的 ToNumber 流程。但由于多了一层函数调用与传参栈帧,在极度追求执行速度的循环内部通常不作为首选。

JavaScript获取当前时间戳的5种常用写法
图2:JavaScript 5种常用时间戳写法的执行步骤与调用过程

七、进阶细节:13位毫秒转10位秒级时间戳

在前后端接口交互过程中,后端语言(如PHP系统函数 time()、Python的 int(time.time())、MySQL的 UNIX_TIMESTAMP())通常采用10位秒级时间戳。若直接传递JavaScript原生的13位时间戳,容易导致后端计算错误或超出预期范围。

标准转换方法

最稳妥的转换方式是使用 Math.floor() 对除以1000后的结果向下取整:

// 获取当前10位Unix秒级时间戳
const unixTimestamp = Math.floor(Date.now() / 1000);

console.log(unixTimestamp); 
// 示例输出:1730345678(正好10位整型)
避坑提醒:不要使用按位或操作符进行取整
在部分网络教程中常能见到 (Date.now() / 1000) | 0 或 ~~(Date.now() / 1000) 这种写法。请注意:JavaScript的按位操作符会将操作数强制转换为32位有符号整数(最高支持到 2,147,483,647)。当前时间戳数值已超过 1.7×109,当时间推进至 2038年1月19日(经典的32位Unix时间溢出危机)时,位运算会导致时间戳溢出为负数。因此在现代工程项目中,必须使用 Math.floor()。
JavaScript获取当前时间戳的5种常用写法
图3:13位毫秒时间戳结构解析与10位秒级时间戳换算细节

八、5种常用写法的综合对比与选型建议

为了帮助读者在不同开发场景下选择最合适的时间戳获取方式,下表对5种写法在执行效率、语义表达与适用场景维度进行了横向汇总:

写法语法 规范引入 底层对象分配 可读性评价 推荐使用场景
Date.now() ES5 无(直接底层取值) 清晰直观 日常开发默认首选,高频循环、性能敏感路径
+new Date() ES1 (传统) 有(分配Date实例) 紧凑但需理解隐式转换 快速原型、代码轻量化脚本、老旧系统维护
new Date().getTime() ES1 (传统) 有(分配Date实例) 极佳,意图自解释 已有Date实例时复用,面向对象业务编程
new Date().valueOf() ES1 (传统) 有(分配Date实例) 良好,与getTime等价 通用对象求值接口对接,一般倾向于getTime
Number(new Date()) ES1 (传统) 有(分配Date实例) 良好,显式类型转换 团队强类型规范约束场景
JavaScript获取当前时间戳的5种常用写法
图4:JavaScript 获取时间戳场景选型决策树

九、总结

在JavaScript中获取当前时间戳共有5种主要写法,其根本区别在于是否需要经历创建 Date 实例的过程以及使用哪种求值契约:

  • 若仅需要快速、无副作用地获取当前时刻的时间戳,Date.now() 是无可争议的最佳选择,代码精炼且执行开销最低;
  • 若程序上下文中已经存在实例化的 Date 对象,直接调用 date.getTime() 能保持良好的代码语义与通用性;
  • 当与后端接口对接需要10位秒级Unix时间戳时,使用 Math.floor(Date.now() / 1000) 进行转换,杜绝32位位运算隐患。
作者最新文章
相关文章
更多