news 2026/4/23 5:36:28

JavaScript Date 语法要过时了!以后用这个替代!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript Date 语法要过时了!以后用这个替代!

1. 前言

作为一名前端开发工程师,你一定被 JavaScript 的日期处理折磨过。

这不是你的问题,是 JavaScript 自己的问题——它的 Date 功能真的很糟糕。

2. Date 的离谱行为

让我给你举几个例子,你就明白有多离谱了:

月份从 0 开始计数:

// 你以为这是 2026 年 1 月 1 日? console.log(new Date(2026, 1, 1)); // 结果:2026 年 2 月 1 日! // 因为月份是从 0 开始数的:0=1月,1=2月... // 但年份和日期又是正常计数的

日期格式混乱到让人抓狂:

// 用斜杠分隔,加不加前导零都没问题 console.log(new Date("2026/01/02")); // Fri Jan 02 2026 00:00:00 GMT+0800 (中国标准时间) // 但如果用短横线分隔,同样的写法 console.log(new Date("2026-01-02")); // Fri Jan 02 2026 08:00:00 GMT+0800 (中国标准时间) // 时间居然不一样了! // 如果用东半球标准时间,更离谱!一个是 1 月 2 日,一个是 1 月 1 日

两位数年份的迷惑行为:

console.log(new Date("49")); // 2049 年 console.log(new Date("99")); // 1999 年 console.log(new Date("100")); // 公元 100 年!

规则莫名其妙:33-99 代表 1900 年代,但 32-49 又代表 2000 年代,100 以上就真的是公元那一年了。

更致命的问题是 —— 日期居然可以被“改变”!

const today = new Date(); console.log(today.toDateString()); // Fri Jan 09 2026 // 我想算一下明天是几号 const addDay = (theDate) => { theDate.setDate(theDate.getDate() + 1); return theDate; }; console.log(`明天是 ${addDay(today).toLocaleDateString()}。`); // 明天是 2026/1/10。 console.log(`今天是 ${today.toLocaleDateString()}。`); // 今天是 2026/1/10。 // 等等,今天怎么也变成明天了?!

当然这是可以解释的:

因为today就像一个地址,指向内存里的某个位置。当你把 today 传给函数时,函数拿到的也是这个地址。所以当函数修改日期时,原来的 today 也被改了。

但这种设计违反了一个基本常识:日期应该是固定的。“2026 年 1 月 10 日”就是“2026 年 1 月 10 日”,不应该因为你拿它做了个计算,它自己就变了。

所以 Date 真的很糟糕。实际上,它就是挂羊头卖狗肉,它叫做 Date,表示日期,实际上,它是时间。

在内部,Date 是以数值形式存储的,这就是我们熟悉的以 1000 毫秒为单位的时间戳

时间当然包含日期,你可以从时间中推断出日期,但这多少有点恶心了。

Java 早在 1997 年就弃用了其 Date 类,而 JavaScript 的 Date 类仅仅在几年后就问世了;与此同时,我们却一直被这个烂摊子困扰着。

正如你目前所见,它在解析日期方面极其不稳定。它除了本地时间和格林威治标准时间
(GMT) 之外,对其他时区一无所知。而且,Date 类只支持公历。它完全不理解夏令时
的概念。当然最糟糕的还是它的可变的,这直接让他偏离了时间的本质。

所有这些缺陷使得使用第三方库来解决这些问题变得异常普遍,其中一些库体积庞大,这种性能损耗已经对网络造成了切实可衡量的损害。

3.
Temporal 才是未来

幸运的是,Date 即将彻底退出历史舞台。

当然这样说,还是有点夸张了。

实际上是它会一直存在,但如果可以避免,你最好不要再用它了。

因为我们会有一个完全取代 Date 的对象 —— Temporal。

部分同学可能对 Temporal 这个单词不太熟悉,实际上,它的意思就是“时间”,你可以理解为它是一个更专业的词汇:

与 Date 不同,Temporal 不是构造函数,它是一个命名空间对象——一个由静态属性和方法组成的普通对象,就像 Math 对象一样:

console.log(Temporal); /* Result (expanded): Temporal { … } Duration: function Duration() Instant: function Instant() Now: Temporal.Now { … } PlainDate: function PlainDate() PlainDateTime: function PlainDateTime() PlainMonthDay: function PlainMonthDay() PlainTime: function PlainTime() PlainYearMonth: function PlainYearMonth() ZonedDateTime: function ZonedDateTime() Symbol(Symbol.toStringTag): "Temporal" */

Temporal 包含的类和命名空间对象允许你计算两个时间点之间的持续时间、表示一个时间点(无论是否具有时区信息)、通过 Now 属性访问当前时间点等。

如果我们要获取当前时间:

console.log(Temporal.Now.plainDateISO()); /* Result (expanded): Temporal.PlainDate 2025-12-31 <prototype>: Object { … } */

该方法返回的是当前时区的今天日期。

Temporal 还能支持时区:

const date = Temporal.Now.plainDateISO(); // 指定这个日期在伦敦时区 console.log(date.toZonedDateTime("Europe/London"));

Temporal 还可以计算日期差:

const today = Temporal.Now.plainDateISO(); const jsShipped = Temporal.PlainDate.from("1995-12-04"); // JavaScript 发布日期 const difference = today.since(jsShipped, { largestUnit: "year" }); console.log(`JavaScript 已经存在了 ${difference.years} 年 ${difference.months} 个月零 ${difference.days} 天。`);

各种时间操作也会更加直观:

const today = Temporal.Now.plainDateISO(); // 加一天 console.log(today.add({ days: 1 })); // 加一个月零一天,再减两年——可以链式操作 console.log(today.add({ months: 1, days: 1 }).subtract({ years: 2 })); // 看,多清楚!

当然,更重要的是,日期不会被意外修改

const today = Temporal.Now.plainDateISO(); // 计算明天的日期 const tomorrow = today.add({ days: 1 }); console.log(`今天是 ${today}。`); // 2025-12-31 console.log(`明天是 ${tomorrow}。`); // 2026-01-01 // 今天还是今天,完美!

add方法会返回一个新的日期对象,而不是修改原来的。就像你复印了一份日历,在复印件上写字,原件不会被弄脏。

4. 什么时候能用?

好消息:最新版的 Chrome 和 Firefox
已经支持了!

坏消息:它还在“实验阶段”,这意味着具体用法可能还会微调,但大方向已定。

我们终于要和 Date 的噩梦说再见了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 12:24:40

导师严选2026 TOP9 AI论文写作软件:专科生毕业论文必备测评

导师严选2026 TOP9 AI论文写作软件&#xff1a;专科生毕业论文必备测评 2026年AI论文写作软件测评&#xff1a;为何值得专科生关注 随着人工智能技术的不断进步&#xff0c;AI论文写作工具逐渐成为学术研究中不可或缺的辅助工具。对于专科生而言&#xff0c;撰写毕业论文不仅是…

作者头像 李华
网站建设 2026/4/16 11:01:47

计算机毕业设计springboot基于前后端分离技术的未成年人心理健康咨询系统 基于 SpringBoot 与 Vue 的青少年心理支持平台的设计与实现 前后端分离架构下校园儿童心理援助服务系统

计算机毕业设计springboot基于前后端分离技术的未成年人心理健康咨询系统0614u0m8 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在“双减”与疫情后时代&#xff0c;未成年人焦…

作者头像 李华
网站建设 2026/4/21 23:34:03

量化基金的3个“谍战级”秘密武器,散户根本没法玩

引言: 你是否常常感到困惑&#xff1f;明明周末看到了各种利好消息&#xff0c;满心期待周一的大涨&#xff0c;结果开盘就是“高开低走”&#xff0c;自己总像是慢了半拍。你感觉自己仿佛在和一个看不见的对手博弈&#xff0c;总是在你做出决定之后&#xff0c;市场就走向了反…

作者头像 李华
网站建设 2026/4/21 2:40:41

SRC漏洞挖掘技巧,带你零基础入门到精通赏金!

SRC漏洞挖掘技巧&#xff0c;带你零基础入门到精通赏金&#xff01; 前言 经常会有粉丝朋友私信我&#xff0c;想探究一下国内的SRC&#xff08;安全响应中心&#xff09;平台究竟支持了多少白帽黑客的生活&#xff1f;又有多少白帽黑客能够不依赖于传统工作&#xff0c;全职…

作者头像 李华
网站建设 2026/4/22 13:17:46

电缆护层保护器工作方式详解

电缆护层保护器的工作原理电缆护层保护器主要用于防止电力电缆金属护层&#xff08;如铝护套或铅护套&#xff09;因感应电压或故障电流导致的过电压损坏。其核心功能是通过限制护层电压在安全范围内&#xff0c;同时为故障电流提供低阻抗通路。主要工作方式限压保护 护层保护器…

作者头像 李华
网站建设 2026/4/19 19:48:34

扔掉文本思维链!DiffThinker证明:最好的推理语言不是英语,是像素

DiffThinker让AI像人类一样直接在视觉空间中构思解题路径&#xff0c;彻底抛弃了文本中介的冗余&#xff0c;以生成式图像推理&#xff0c;开启了机器视觉思维的新可能。令人惊叹&#xff01;基于Qwen-Image-Edit打造的DiffThinker&#xff0c;将图像编辑扩散模型变成了多模态视…

作者头像 李华