如何在JavaScript中格式化日期:性能指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript中的日期格式化:不仅仅是“拼接字符串”



“How do I format a date in JavaScript?”这个问题是Stack Overflow上最热门的问题之一。这并不奇怪。每个开发者都至少遇到过这样的情况:需要以非标准格式“Fri Feb 14 2025 12:00:00 GMT+0300”输出日期,而是美观地显示为“2025年2月14日”或“2025-02-14”。看起来很简单?但其中隐藏的陷阱和性能问题可不少。



在本文中,我们将探讨JavaScript中所有格式化日期的方法:从最简单的到高性能的。您将学习如何避免常见错误,并使代码不仅美观,而且高效。开始吧!



为什么原生的Date对象如此不便?



JavaScript内置的Date对象,说白了,是“历史的包袱”。它不像Python或PHP那样提供内置的format()方法。相反,您必须手动使用getter方法来拼凑日期:



const date = new Date();const day = String(date.getDate()).padStart(2, '0');const month = String(date.getMonth() + 1).padStart(2, '0');const year = date.getFullYear();console.log(`${year}-${month}-${day}`); // "2025-02-14"


这虽然可行,但看起来很笨重。如果还需要本地化日期(例如,显示为中文),代码会膨胀到不合理的程度。这正是开发者寻找替代方案的原因。



toLocaleDateString方法:简单快捷



在JavaScript中格式化日期最简单的方法是使用toLocaleDateString()方法。它接受一个区域设置和一个选项对象:



const date = new Date();const options = { year: 'numeric', month: 'long', day: 'numeric' };console.log(date.toLocaleDateString('zh-CN', options)); // "2025年2月14日"


此方法会自动适应区域设置。想要“February 14, 2025”?只需将区域设置改为'en-US'即可。



优点:

  • 使用简单。
  • 内置本地化功能。
  • 代码读起来像自然语言。


缺点:

  • 性能:每次调用toLocaleDateString()都会创建一个新的格式化器对象。在包含1000个元素的循环中,这可能会很明显。
  • 对格式的控制有限(例如,无法输出不带年份的“14.02.2025”)。


Intl.DateTimeFormat:强大且高效



为了更精细的控制和优化,请使用Intl.DateTimeFormat。这是一个可以创建一次并重复使用的对象:



const formatter = new Intl.DateTimeFormat('zh-CN', {  year: 'numeric',  month: '2-digit',  day: '2-digit'});

const date1 = new Date();const date2 = new Date('2024-12-25');console.log(formatter.format(date1)); // "2025/02/14"console.log(formatter.format(date2)); // "2024/12/25"


为什么更快? 因为格式化器对象只创建一次,而不是每次调用时都创建。在性能测试中,Intl.DateTimeFormat在循环中比toLocaleDateString()快5到10倍。



此外,Intl.DateTimeFormat支持额外的选项,例如weekday、hour、minute、second甚至timeZone:



const formatter = new Intl.DateTimeFormat('en-US', {  weekday: 'long',  year: 'numeric',  month: 'short',  day: 'numeric',  hour: '2-digit',  minute: '2-digit'});console.log(formatter.format(new Date())); // "Friday, Feb 14, 2025, 12:00 PM"


一个棘手的问题:如果需要以“2025-02-14”格式输出日期而不进行本地化怎么办?Intl.DateTimeFormat无法单独输出小时、分钟和秒,但对于简单的日期来说,这

博客

书籍推荐