JavaScript获取时间戳的几种方法
在JavaScript中获取当前时间戳是前端开发中常见的需求。本文详细介绍了获取JavaScript时间戳的几种方法,包括最常用的 `Date.now()` 方法,以及 `new Date().getTime()` 和 `new Date().valueOf()`。重点强调了JavaScript时间戳以毫秒为单位,与Unix时间戳(秒)的区别,并提醒开发者注意单位转换,避免潜在的时间错误。此外,文章还深入剖析了前端处理时间戳时常见的误区,如时区问题、客户端时间不可靠等,并推荐使用 date-fns 或 dayjs 等专业日期处理库,以实现灵活的日期格式化、时区处理和安全的日期加减运算,提升开发效率与代码可靠性。
获取JavaScript当前时间戳最推荐的方式是使用 Date.now(),它返回自1970年1月1日00:00:00 UTC以来的毫秒数,且不创建实例,性能更优;2. new Date().getTime() 和 new Date().valueOf() 也可获取毫秒级时间戳,结果与 Date.now() 一致,但 Date.now() 更简洁高效;3. 若需秒级时间戳,应使用 Math.floor(Date.now() / 1000) 将毫秒转换为秒;4. JavaScript时间戳单位为毫秒,而Unix时间戳单位为秒,两者需注意单位转换,避免因未乘除1000导致时间错误;5. 常见误区包括:混淆毫秒与秒单位、忽略时区影响(时间戳为UTC,显示时会本地化)、依赖不可靠的客户端时间、错误解析字符串时间戳(应先转为数字)、手动处理复杂日期计算易出错;6. 对于格式化和高级操作,建议使用 date-fns 或 dayjs 等专业库,以实现灵活的日期格式化、时区处理和安全的日期加减运算,提升开发效率与代码可靠性。

JavaScript获取当前时间戳,最直接且推荐的方式是使用 Date.now() 方法。它返回的是自1970年1月1日00:00:00 UTC(协调世界时)以来经过的毫秒数。
解决方案
在JavaScript里,想拿到当前的时间戳,其实有好几种途径,但最常用也最推荐的,无非是那几个:
首先,是 Date.now()。这是ES5之后引入的一个静态方法,非常简洁高效。你直接调用 Date.now() 就能得到一个数字,这个数字就是当前时间距离Unix纪元(1970年1月1日00:00:00 UTC)的毫秒数。我个人在项目中,只要是需要毫秒级时间戳,几乎都首选它,因为它不创建 Date 对象实例,性能上会略胜一筹。
const timestampMs = Date.now(); console.log(timestampMs); // 例如:1678886400000
其次,如果你更习惯或者代码里已经有了 Date 对象实例,那么 new Date().getTime() 也是一个非常常见且有效的方法。它和 Date.now() 的结果是一样的,都是毫秒数。
const dateObj = new Date(); const timestampMsFromGetTime = dateObj.getTime(); console.log(timestampMsFromGetTime); // 和上面结果类似
还有一个是 new Date().valueOf(),这个方法其实和 getTime() 几乎等价,也是返回毫秒数。在实际开发中,用 getTime() 的频率可能更高一些,但知道 valueOf() 的存在也无妨。
const timestampMsFromValueOf = new Date().valueOf(); console.log(timestampMsFromValueOf); // 同样是毫秒数
如果你需要的是秒级时间戳,那也很简单,把毫秒数除以1000,再向下取整就行了:
const timestampSec = Math.floor(Date.now() / 1000); console.log(timestampSec); // 例如:1678886400
通常情况下,我建议优先使用 Date.now(),因为它最直接、性能也最好。
JavaScript时间戳的单位是什么?它和Unix时间戳有什么区别?
这个问题其实挺关键的,很多初学者会在这里犯迷糊。简单来说,JavaScript内置获取的时间戳,比如 Date.now() 或者 new Date().getTime(),它们的单位都是毫秒(milliseconds)。这意味着你得到的是一个很大的整数,代表自1970年1月1日00:00:00 UTC以来经过的毫秒总数。
而我们常说的“Unix时间戳”或者“POSIX时间戳”,它的标准单位是秒(seconds)。也就是说,Unix时间戳是自1970年1月1日00:00:00 UTC以来经过的秒数。
所以,它们之间的核心区别就在于单位:
- JavaScript时间戳(Date.now()等):毫秒
- Unix时间戳:秒
这就意味着,如果你从后端API拿到的时间戳是秒级的Unix时间戳,而你前端JS需要用 Date 对象处理(new Date() 构造函数默认接受毫秒数),你就需要把它乘以1000。反之,如果你用JS获取了毫秒级时间戳,想传给后端或者其他系统期望秒级时间戳的地方,那就得除以1000并取整。
我遇到过不少次,因为没有注意这个单位差异,导致日期显示错误或者数据处理出问题的情况。比如,一个秒级时间戳 1678886400(代表2023年3月15日),如果你直接 new Date(1678886400),JS会把它当成1970年1月1日后1678886400毫秒,那结果就完全不对了,可能显示成1970年的某个时间。正确的做法是 new Date(1678886400 * 1000)。所以,在处理时间戳时,确认其单位是第一步。
在前端开发中,处理时间戳时有哪些常见的“坑”或误区?
处理时间戳和日期在前端开发中真是个老大难的问题,我踩过的坑可不少。除了上面提到的毫秒和秒的单位混淆,还有几个点是大家经常会忽略的:
时区问题: 时间戳本身是UTC时间(协调世界时),它不包含任何时区信息。但当你把时间戳转换成
Date对象,并用toLocaleString()或直接在浏览器控制台打印时,它会根据你当前系统的时区进行本地化显示。这对于需要展示特定时区时间(比如后端存储的是北京时间,但用户在纽约)的场景来说,就很容易出问题。我通常会建议,如果涉及到跨时区展示,要么后端直接返回格式化好的字符串,要么前端使用专门的日期库(如date-fns-tz或dayjs的时区插件)来精确控制时区转换。客户端时间不可靠: 用户的本地设备时间是不受控的,他们可以随意更改。这意味着,如果你完全依赖
Date.now()来生成操作时间戳(比如记录用户操作时间),一旦用户修改了系统时间,你的数据就可能不准确,甚至出现“未来时间”或者“过去时间”。对于需要严格时间记录的场景,我通常会要求后端提供一个服务器时间戳,前端在发起请求时带上这个时间戳,或者至少在关键操作时依赖服务器时间。字符串时间戳的解析: 有时候后端返回的时间戳是字符串形式,比如
'1678886400000'。虽然JavaScript的Date构造函数能够解析一些日期字符串(如ISO 8601格式),但对于纯数字字符串,直接new Date('1678886400000')可能会有问题,或者在不同浏览器上表现不一致。最稳妥的做法是先用parseInt()或Number()将其转换为数字,再进行处理:new Date(parseInt('1678886400000'))。日期计算的复杂性: 比如计算两个日期之间相差多少天,或者在某个日期上增加一个月。这些操作看似简单,但涉及到月份天数不一、闰年等复杂情况时,手动计算很容易出错。这就是为什么我会强烈推荐使用成熟的日期处理库,它们已经处理了这些复杂的边缘情况。
这些“坑”往往不是代码语法错误,而是逻辑上的偏差,一旦上线就可能带来难以追踪的问题。
除了简单的获取,如何在JavaScript中对时间戳进行格式化和更灵活的日期操作?
仅仅获取时间戳显然不够,在前端界面上,我们通常需要将这些枯燥的数字转换成用户能看懂的、友好的日期时间格式,比如“2023年3月15日 下午3:00”。同时,我们可能还需要进行各种日期操作,比如计算几天后、几小时前。
最基础的,你可以把时间戳转换成 Date 对象,然后利用 Date 对象自带的一些方法:
const timestampMs = Date.now(); const date = new Date(timestampMs); // 基本的本地化字符串 console.log(date.toLocaleString()); // 比如 "2023/3/15 下午3:00:00" (格式取决于浏览器和地区) console.log(date.toLocaleDateString()); // 比如 "2023/3/15" console.log(date.toLocaleTimeString()); // 比如 "下午3:00:00" // 获取特定部分 console.log(date.getFullYear()); // 年 console.log(date.getMonth() + 1); // 月 (注意:0-11,所以要加1) console.log(date.getDate()); // 日 console.log(date.getHours()); // 小时 console.log(date.getMinutes()); // 分钟 console.log(date.getSeconds()); // 秒
虽然 Date 对象提供了这些基础方法,但它的格式化能力有限,而且链式调用不方便,更别提复杂的日期加减和时区处理了。在我看来,一旦项目对日期时间操作有稍微复杂一点的需求,引入一个专业的日期处理库几乎是必然的选择。
目前前端比较流行的日期库有:
date-fns: 这是一个非常轻量且模块化的库,它提供了大量纯函数,你可以按需引入。它的API设计非常现代化,我很喜欢它“函数式”的风格,比如format(date, 'yyyy-MM-dd HH:mm:ss')这种方式,非常直观。dayjs: 另一个轻量级替代品,API设计上高度兼容Moment.js,如果你之前用过Moment.js,迁移成本很低。它也支持插件系统来扩展功能,比如时区支持。Moment.js: 虽然官方已经宣布进入维护模式,不再推荐新项目使用,但它在很多老项目中依然广泛存在。它的链式调用和强大的格式化能力确实很方便。如果你的项目已经在使用它,也没必要为了这个而大动干戈去替换。
以 date-fns 为例,格式化和日期加减会变得非常优雅:
// 假设你已经安装了 date-fns
// import { format, addDays, subHours } from 'date-fns';
// 格式化
// console.log(format(new Date(), 'yyyy年MM月dd日 HH:mm:ss')); // 2023年03月15日 15:00:00
// 日期加减
// const tomorrow = addDays(new Date(), 1); // 明天
// const twoHoursAgo = subHours(new Date(), 2); // 两小时前
// console.log(format(tomorrow, 'yyyy-MM-dd'));
// console.log(format(twoHoursAgo, 'HH:mm'));选择一个合适的日期库,能够大大提升开发效率,减少因日期处理逻辑复杂而引入的bug。我个人倾向于 date-fns 或 dayjs,它们更符合现代前端的轻量化趋势。
今天关于《JavaScript获取时间戳的几种方法》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
Linux查看MAC地址常用命令汇总
- 上一篇
- Linux查看MAC地址常用命令汇总
- 下一篇
- PyCharm用什么语言开发?技术解析
-
- 文章 · 前端 | 34分钟前 | 前端 · javascript · Fetch AbortController AbortSignal 请求取消 前端异步
- AbortController 复用后请求立即取消的生命周期
- 418浏览 收藏
-
- 文章 · 前端 | 1小时前 |
- Web Locks API 的 ifAvailable 模式避免长时间等待
- 261浏览 收藏
-
- 文章 · 前端 | 4小时前 | 性能优化 · javascript · SharedArrayBuffer 前端性能 Atomics 跨源隔离 Web Worker
- Web Worker 配合 SharedArrayBuffer 共享高频数据
- 301浏览 收藏
-
- 文章 · 前端 | 6小时前 |
- View Transitions API 处理跨页面导航动画
- 310浏览 收藏
-
- 文章 · 前端 | 16小时前 | React useOptimistic 失败回滚 并发更新
- React useOptimistic 如何处理失败回滚与并发更新
- 286浏览 收藏
-
- 文章 · 前端 | 18小时前 |
- Vite 环境 API 如何为多运行时组织构建配置
- 418浏览 收藏
-
- 文章 · 前端 | 20小时前 |
- Web Locks API 的等待请求如何支持用户主动取消
- 239浏览 收藏
-
- 文章 · 前端 | 1天前 |
- JavaScript Iterator Helpers 怎样组合惰性数据处理
- 110浏览 收藏
-
- 文章 · 前端 | 1天前 | css ·
- CSS 容器样式查询如何根据父级状态改组件
- 120浏览 收藏
-
- 文章 · 前端 | 1天前 | prefetch 前端性能 Speculation Rules API prerender
- Speculation Rules API 如何安全预渲染下一页
- 202浏览 收藏
-
- 文章 · 前端 | 1天前 | javascript · 前端性能 长任务 INP优化 交互延迟 web-vitals Long Animation Frames
- INP 偏高时如何定位长任务与交互延迟
- 257浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 405次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 483次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 493次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 437次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 262次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 智能体安全引领产业升级——国内AI安全产品市场深度分析
- 2026-08-21 501浏览
-
- CSS变量简化按钮悬停效果技巧
- 2026-05-31 501浏览
-
- JavaScript符号类型详解与应用
- 2026-05-31 501浏览
-
- HTML剪贴板复制粘贴怎么用
- 2026-05-26 501浏览

