Skip to content

JavaScript 日期格式

JavaScript 提供了一个内置的 Date 对象,用于处理日期和时间。理解如何创建和操作这些对象对于许多 Web 应用程序至关重要。

有几种方法可以创建 Date 对象:

  • 使用 new Date():创建一个包含当前日期和时间的 Date 对象。
  • 使用 new Date(milliseconds):根据自 UNIX 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数创建 Date 对象。
  • 使用 new Date(year, monthIndex, day, hours, minutes, seconds, milliseconds):这是创建特定本地时间日期的最可靠方法。注意: monthIndex 是零索引的(0 表示一月,11 表示十二月)。
  • 使用 new Date(dateString):通过解析日期字符串创建一个 Date 对象。此方法对于非 ISO 8601 格式可能不可靠。

创建 Date 对象的示例:

const currentDate = new Date();
console.log(currentDate);
const epochDate = new Date(0);
console.log(epochDate); // Shows Thu Jan 01 1970 ...
const specificDate = new Date(2024, 0, 15, 10, 30, 0); // January 15, 2024, 10:30:00 AM (local time)
console.log(specificDate);

ISO 8601 是一种表示日期和时间的国际标准。当使用 new Date(dateString) 解析日期字符串时,ISO 8601 格式在不同的 JavaScript 引擎中解析最可靠。

常见的 ISO 8601 格式:

  • 仅日期:YYYY-MM-DD(例如,“2024-01-15”)
  • 年和月:YYYY-MM(例如,“2024-01”)
  • 仅年份:YYYY(例如,“2024”)
  • 日期和时间 (UTC):YYYY-MM-DDTHH:mm:ssZ(例如,“2024-01-15T10:30:00Z”)
  • 带偏移量的日期和时间:YYYY-MM-DDTHH:mm:ss+HH:mm 或 YYYY-MM-DDTHH:mm:ss-HH:mm(例如,“2024-01-15T15:00:00+05:30”)
const isoDate = new Date("2024-01-15");
console.log(isoDate);
const isoDateTimeUTC = new Date("2024-01-15T10:30:00Z");
console.log(isoDateTimeUTC.toUTCString());

在 ISO 8601 格式中:‘T’ 是一个分隔日期和时间的字面量字符。‘Z’ 表示 UTC(世界协调时间)。还可以指定时区偏移量,如 ‘+05:30’ 或 ‘-08:00’。UTC 是现代时间标准,在大多数技术用途中有效替代了 GMT。

其他日期字符串格式(谨慎使用)

Section titled “其他日期字符串格式(谨慎使用)”

虽然 Date 构造函数可能会尝试解析其他人类可读的字符串格式,但这种行为在不同的浏览器和 JavaScript 引擎之间通常是不一致的。强烈建议在生产应用中避免依赖解析非 ISO 8601 的日期字符串。

长格式日期(例如,“Jan 15 2024”):

Section titled “长格式日期(例如,“Jan 15 2024”):”

像“January 15 2024”或“15 Jan 2024”这样的字符串可能会被解析,但它们的解释可能会有所不同。

// 潜在可解析的长格式日期示例(行为可能因环境而异)
const longDate = new Date("Jan 15 2024");
// console.log(longDate); // Check output carefully

月份名称可以是完整的(January),也可以是缩写(Jan)。逗号通常会被忽略,名称通常不区分大小写,但依赖于这些细节是有风险的。

短格式日期(例如,“MM/DD/YYYY” 或 “DD/MM/YYYY”):

Section titled “短格式日期(例如,“MM/DD/YYYY” 或 “DD/MM/YYYY”):”

“01/15/2024”等格式高度模糊。根据区域设置和 JavaScript 引擎的不同,这可能被解释为 1 月 15 日,或者(在某些地区)解释为第 15 个月的第 1 天(这是无效的)。避免直接解析这些格式。

// 模糊短格式日期示例(解析时应避免)
// const shortDate = new Date("01/15/2024"); // Highly unreliable

实现特定的字符串(例如,Date.prototype.toString() 的输出):

Section titled “实现特定的字符串(例如,Date.prototype.toString() 的输出):”

由 myDate.toString() 产生的字符串格式(例如,“Mon Jan 15 2024 10:30:00 GMT+0100 (Central European Standard Time)”)依赖于具体实现,并且在不同浏览器之间有所不同。不应将其用作创建新的 Date 对象的输入格式。

Date 对象提供了获取和设置日期各个组件的方法:

  • getFullYear(),setFullYear(year, [month], [date])
  • getMonth() (0-11),setMonth(month, [date])
  • getDate() (1-31),setDate(date)
  • getHours(),setHours(hour, [min], [sec], [ms])
  • getMinutes(),setMinutes(min, [sec], [ms])
  • getSeconds(),setSeconds(sec, [ms])
  • getMilliseconds(),setMilliseconds(ms)
  • getTime()(自 epoch 以来的毫秒数),setTime(milliseconds)
  • getDay()(星期几,0 代表星期日,6 代表星期六)
const demoDate = new Date(2024, 0, 15); // Jan 15, 2024
console.log(demoDate.getFullYear()); // 2024
console.log(demoDate.getMonth()); // 0 (January)
demoDate.setDate(20);
console.log(demoDate.toDateString()); // Shows date with day 20

为了以人类可读、区域设置敏感的格式向用户显示日期,Intl.DateTimeFormat 对象是现代的标准。

const displayDate = new Date(2024, 0, 15, 14, 0, 0);
const formatterUs = new Intl.DateTimeFormat('en-US', {
year: 'numeric', month: 'long', day: 'numeric',
hour: '2-digit', minute: '2-digit'
});
console.log(formatterUs.format(displayDate)); // e.g., "January 15, 2024, 02:00 PM"
const formatterGb = new Intl.DateTimeFormat('en-GB', {
dateStyle: 'medium', timeStyle: 'short'
});
console.log(formatterGb.format(displayDate)); // e.g., "15 Jan 2024, 14:00"

有关 Intl.DateTimeFormat 的更多选项和区域设置信息,请参阅 MDN Web 文档。

总结处理 JavaScript 中日期的最佳实践:

  • 优先使用数字组件创建日期:new Date(year, monthIndex, ...) 以获得最大的可靠性。
  • 解析字符串时,使用 ISO 8601 格式:new Date('YYYY-MM-DDTHH:mm:ssZ')。
  • 注意月份是零索引的(0 代表一月)。
  • 使用 Intl.DateTimeFormat 向用户显示日期。
  • 对于复杂的日期操作、时区处理、持续时间计算或稳健地解析各种格式,考虑使用成熟的日期工具库。常用的选择包括 date-fns 和 Luxon。这些库通常比原生 Date 对象提供了更直观和全面的 API,适用于高级场景。

您可以在 npm(Node 包管理器)上找到这些库,并将它们包含在您的项目中。例如,搜索“date-fns library”或“Luxon library”以获取文档和安装说明。