JavaScript new Date() 详解

328 阅读3分钟

在 JavaScript 中,new Date() 是处理日期和时间的核心工具。本文将深入剖析其各种构造方式、时区处理技巧、常用方法以及需要特别注意的关键事项,帮助你全面掌握 new Date() 的使用。

一、基本构造方式

// 1. 无参数:返回当前时间
const now = new Date(); // 输出当前本地时间(如2025-02-21T09:22:00+08:00)

// 2. 时间戳(毫秒)
const timestamp = 1708500123456;
const dateFromTimestamp = new Date(timestamp); 

// 3. 日期字符串(推荐ISO 8601格式)
const dateFromString = new Date('2025-02-21'); // 解析为本地时区午夜(注意时区差异)
const dateTimeString = new Date('2025-02-21T09:22:00Z'); // 明确指定UTC时间

// 4. 多参数形式(月份从0开始!)
const dateParams = new Date(2025, 1, 21, 9, 22, 0); // 2025年2月21日 09:22:00(本地时区)
// 参数顺序:年, 月(0-11), 日, 时, 分, 秒, 毫秒

二、常用方法

获取时间分量(本地时区)

const date = new Date('2025-02-21T09:22:00+08:00');
date.getFullYear();   // 2025
date.getMonth();      // 1(2月,月份0-11)
date.getDate();       // 21(日期)
date.getHours();      // 9(本地时区小时)
date.getUTCHours();   // 1(UTC小时,+8时区下09:22对应UTC 01:22)

时间格式化

date.toISOString();        // "2025-02-21T01:22:00.000Z"(UTC时间)
date.toLocaleDateString(); // "2025/2/21"(根据系统区域设置)
date.toLocaleTimeString(); // "09:22:00"(本地格式)

时间计算

// 时间戳转换
const timestamp = date.getTime(); // 获取毫秒时间戳

// 计算时间差
const start = new Date('2025-02-21');
const end = new Date('2025-02-23');
const diffMs = end - start; // 172800000毫秒(2天)

三、时区处理关键点

1. 默认行为:

  • new Date() 创建的实例基于浏览器/运行环境的时区
  • 使用 getUTC*() 方法获取UTC时间分量,get*() 获取本地时间分量。

2. 字符串解析陷阱:

new Date('2025-02-21');        // 在UTC+8时区解析为2025-02-21T08:00:00Z(本地午夜)
new Date('2025-02-21 09:22');  // 部分浏览器可能解析为UTC,慎用非标准格式!

3. 安全实践:

  • 始终使用ISO 8601格式(YYYY-MM-DDTHH:mm:ss.sssZ)
  • 涉及跨时区应用时,存储和传输使用UTC时间。

四、注意事项

  1. 月份从0开始: 1月=0,12月=11,易引发错误,需特别注意。
  2. 夏令时问题: 某些时区在夏令时切换时会导致时间计算异常,需测试边界条件。
  3. 浏览器兼容性: 部分旧浏览器对非ISO格式字符串解析不一致,建议优先使用参数构造或时间戳。

五、示例:日期操作

// 增加1天
const date = new Date('2025-02-21');
date.setDate(date.getDate() + 1); // 2025-02-22

// 比较日期
const isAfter = new Date('2025-02-22') > new Date('2025-02-21'); // true

附加建议

使用日期库统一处理

推荐Dayjs替代原生Date,规避浏览器差异。

如需更复杂操作(如时区转换、高级格式化),可以使用库如 Luxondate-fns

移动端兼容性测试

在 iOS Safari 中优先使用 YYYY-MM-DDTHH:mm:ss.sssZ 格式,避免空格分隔。