1. Date 对象的基本用法
1.1 创建日期与获取当前时间
在 JavaScript 中,Date 对象是处理日期时间的核心,new Date() 可以直接获得当前时刻的日期对象,而 Date.now() 会返回自 1970-01-01 00:00:00 UTC 以来的毫秒时间戳。通过这些方式,可以快速进入日期时间的后续处理。
// 获取当前日期时间
const now = new Date();
console.log(now.toString());// 获取自 1970-01-01 起经过的毫秒数
const t = Date.now();
console.log(t);
当前日期信息是方便后续格式化与对比的基础,通常会将 Date 对象用于显示、排序和时间计算等场景。
1.2 设置日期与时间
Date 对象是可变的,可以用一系列 set* 方法修改日期时间,如 setFullYear、setMonth、setDate、setHours 等,注意 Month 的取值从 0 开始(0 代表一月,11 代表十二月)。
const d = new Date(); // 当前日期
d.setFullYear(2025);
d.setMonth(11); // 12 月
d.setDate(25);
d.setHours(15, 30, 0, 0);
console.log(d.toString());
通过链式或分步设置,可以实现对特定时间点的精确定位,这在日程安排、事件触发等场景中非常常见。
1.3 时间戳与毫秒级处理
除了直接操作日期字段,时间戳 (毫秒数) 作为数值表达在计算差值、排序等方面非常高效。d.getTime() 与 Date.now() 提供毫秒时间戳的访问方式。
const a = new Date(2023, 0, 1); // 2023-01-01 本地时间
const ts = a.getTime(); // 毫秒时间戳
console.log(ts);// 两个日期之间的差值(毫秒)
const b = new Date(2023, 0, 2);
console.log(b.getTime() - a.getTime());
毫秒级别的差值计算是实现事件调度、计时器和日志时间线对齐的关键,在日志分析和数据对齐中经常使用。
2. Date 的常用方法大全
2.1 获取日期字段的方法
Date 对象提供了丰富的获取字段的方法,包括 getFullYear、getMonth、getDate、getDay、getHours、getMinutes、getSeconds、getMilliseconds 等,注意月份需要加 1 才是日历中的实际月。
const d = new Date();
console.log(d.getFullYear(), d.getMonth() + 1, d.getDate());
console.log(d.getDay()); // 0-周日, 6-周六
getTime/valueOf 常用于时间戳比较,而 toString/toUTCString 则用于人类可读输出。
2.2 UTC 与本地时间相关方法
关于时区的处理,Date 对象同时提供本地时间和 UTC 时间的获取方法,如 getUTCFullYear、getUTCMonth、getUTCDate 等,便于在跨时区场景中进行统一计算。
const d = new Date();
console.log(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate());
UTC 方法避免了时区带来的错位问题,在后端日志、跨区域数据对齐时非常实用。
2.3 日期格式化方法
Date 对象提供了多种格式化输出的能力,toLocaleDateString、toLocaleString、toISOString、toJSON等方法可以在本地化显示与标准化传输之间进行切换。
const d = new Date();
console.log(d.toLocaleDateString('zh-CN'));
console.log(d.toLocaleString('en-US', { hour: '2-digit', minute: '2-digit' }));
console.log(d.toISOString());
toISOString 输出的是 UTC 时间的标准格式,toLocaleString 则方便直接显示给用户。
3. 时区与本地化处理
3.1 本地化日期显示
通过 Intl.DateTimeFormat 可以实现灵活的本地化输出,locale 和 options 控制显示的语言、区域、以及时间字段的精度。
const d = new Date();
const fmtCN = new Intl.DateTimeFormat('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' });
const fmtUS = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: '2-digit', day: '2-digit' });
console.log(fmtCN.format(d));
console.log(fmtUS.format(d));
本地化输出提升了用户体验,特别是在全球化应用和多语言界面中。
3.2 时区处理注意点
在时间比较或排序时,优先使用 UTC 或时间戳,尽量避免直接比较本地时间字符串。对于显示,使用 Intl.DateTimeFormat 根据地区格式化。
// 以 UTC 进行排序示例
const a = new Date(Date.UTC(2025, 0, 1));
const b = new Date(Date.UTC(2025, 0, 2));
console.log(a.getTime() - b.getTime()); // 负值表示 a 在前
时区一致性是跨系统数据对齐的关键,需要在前端与后端之间保持统一的表达方式。
4. 日期格式化与解析实战
4.1 自定义格式化函数
很多场景需要把日期输出为自定义文本格式,如 YYYY-MM-DD HH:mm:ss,这时可以实现一个简单的格式化函数,并用 padStart 保证两位对齐。
function pad(n) { return n.toString().padStart(2, '0'); }
function formatDate(d) {const y = d.getFullYear();const m = pad(d.getMonth() + 1);const day = pad(d.getDate());const h = pad(d.getHours());const min = pad(d.getMinutes());const s = pad(d.getSeconds());return `${y}-${m}-${day} ${h}:${min}:${s}`;
}
console.log(formatDate(new Date()));
自定义格式便于日志、报表或导出 CSV/JSON 的展示需求,也方便与后端 API 的日期字段对齐。
4.2 解析日期字符串
解析日期字符串时,Date 构造函数和 Date.parse 常用,但要注意不同浏览器对格式的兼容性,ISO 8601 字符串通常更稳健。
const s1 = '2025-12-15T08:30:00Z';
const d1 = new Date(s1);
console.log(d1.toISOString());// 相对简单的解析也可以用自定义分割
function parseYYYYMMDD(str) {const [year, month, day] = str.split('-').map(Number);return new Date(year, month - 1, day);
}
console.log(parseYYYYMMDD('2025-12-15').toDateString());
ISO 字符串提供跨时区一致性,但本地格式在显示时需要转为本地时间输出。
5. 时间差与计时器实战
5.1 计算两个日期之间的差值
要计算两个日期之间的时间差,通常先获取它们的 毫秒时间戳,再转换为天、小时、分钟等单位。diff = end.getTime() - start.getTime(),并据此分解。
function diffInDays(a, b) {const diffMs = Math.abs(a.getTime() - b.getTime());return Math.floor(diffMs / (24 * 60 * 60 * 1000));
}
console.log(diffInDays(new Date('2025-01-01'), new Date('2025-01-20')));
时间差计算是日历应用、任务调度与统计分析的基础,可以进一步扩展到小时、分钟等粒度。

5.2 简单的计时器与轮询场景
在前端中,setInterval 或 setTimeout 常用于简单的计时场景,配合 Date 进行显示与对齐。
let start = new Date();
const timer = setInterval(() => {const now = new Date();const elapsed = Math.floor((now - start) / 1000);console.log(`已运行 ${elapsed} 秒`);
}, 1000);// 停止计时
// clearInterval(timer);
计时器的准确性受浏览器调度影响,实际应用中可结合 Performance API 或 requestAnimationFrame 做优化,但在大多数业务场景下,简单实现已足够。
6. 性能与兼容性注意点
6.1 避免在热路径中频繁创建 Date
在高频执行的代码路径中,频繁 new Date() 可能带来性能开销,建议在循环或关键路径外部缓存日期对象或使用时间戳进行计算,并在需要显示时再创建 Date 对象进行格式化。
// 避免在循环中大量创建 Date
let t = Date.now();
for (let i = 0; i < 1000; i++) {// 将日期计算尽量从时间戳出发const diff = Date.now() - t;// 其他逻辑
}
时间戳运算通常比逐步创建 Date 对象更高效,尤其在数据处理与排序任务中表现明显。
6.2 浏览器兼容与 Node.js
Date 对象在各大浏览器和 Node.js 中基本一致,但在不同环境下的字符串解析和时区行为略有差异,优先使用 ISO 字符串与 UTC 处理,本地化显示再通过 Intl 系列 API 实现。
// Node.js 环境的简单时间戳示例
console.log(Date.now());
console.log(new Date().toISOString());
跨端一致性是多平台应用的要点,需在设计阶段明确时间表达的规范,并在前端和后端同步实现。


