ES6 - Date 对象
ES6+ - 处理日期和时间
Section titled “ES6+ - 处理日期和时间”JavaScript 提供了一个内置的 Date 对象用于处理日期和时间。Date 对象是使用 new Date() 构造函数创建的。
一旦创建了 Date 对象,就可以使用许多方法来获取和设置其组成部分(年、月、日、时、分、秒、毫秒),可以使用本地时间或[协调世界时 (UTC)]。
ECMAScript 标准规定,Date 对象可以表示从 [UNIX epoch (1970 年 1 月 1 日,UTC)] 起,在约 ±273,785 年范围内的任何日期和时间,精度达到毫秒级。
创建 Date 对象
Section titled “创建 Date 对象”有几种方法可以创建 Date 对象:
// 1. 无参数:创建一个表示当前日期和时间的 Date 对象。const now = new Date();console.log('Current time:', now.toString());
// 2. 带毫秒参数:根据自 UNIX epoch(1970 年 1 月 1 日,UTC)以来的毫秒数创建一个 Date 对象。const epochTime = new Date(0); // epoch 本身console.log('Epoch:', epochTime.toUTCString());const specificTime = new Date(1678886400000); // 示例:2023 年 3 月 15 日console.log('Specific time from ms:', specificTime.toString());
// 3. 带日期字符串:通过解析字符串创建一个 Date 对象(格式可能很棘手且依赖于浏览器,推荐使用 ISO 8601 "YYYY-MM-DDTHH:mm:ss.sssZ" 格式)。const dateFromStringISO = new Date('2024-07-26T10:30:00Z'); // ISO 8601 格式(UTC)console.log('From ISO String:', dateFromStringISO.toUTCString());const dateFromStringSimple = new Date('2024-07-26'); // 如果只有日期部分,通常被解释为 UTC;如果同时包含时间且没有 Z,则通常被解释为本地时间。console.log('From Simple Date String:', dateFromStringSimple.toDateString());
// 4. 带单独日期和时间组件(年、月索引、日、时、分、秒、毫秒)- 使用本地时间。// 注意:月份是基于 0 的索引(0 表示一月,11 表示十二月)。const specificComponents = new Date(2024, 6, 26, 14, 45, 30, 500); // 2024 年 7 月 26 日,下午 2:45:30.500,本地时间console.log('From Components:', specificComponents.toString());关于日期字符串的重要说明:
使用 new Date(dateString) 解析日期字符串可能不可靠,因为浏览器实现和区域设置存在差异。通常更安全的方法是使用 [ISO 8601] 格式(YYYY-MM-DDTHH:mm:ss.sssZ)或提供单独的日期组件。对于复杂的日期解析和操作,可以考虑使用专门的库,例如 date-fns 或 Luxon。
Date 对象的属性(静态属性和原型属性)
Section titled “Date 对象的属性(静态属性和原型属性)”Date 对象本身具有静态属性(例如 Date.now()),其实例(使用 new Date() 创建的对象)则拥有从 Date.prototype 继承的方法。
Date.now()(静态方法):返回自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的毫秒数。Date.parse(dateString)(静态方法):解析日期字符串表示形式,并返回自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的毫秒数。(与构造函数一样,解析可能不可靠)。Date.UTC(year, monthIndex[, day[, hours[, minutes[, seconds[, ms]]]]])(静态方法):接受逗号分隔的日期参数,并返回自 1970 年 1 月 1 日 00:00:00 [协调世界时 (UTC)] 以来经过的毫秒数。constructor:实例的一个属性,指向创建该实例的Date函数。prototype:Date构造函数的一个属性,允许向所有Date实例添加属性和方法(通常不建议修改内置原型)。
常用 Date 方法(实例方法)
Section titled “常用 Date 方法(实例方法)”以下是 Date 实例上常用方法的列表。大多数 get 方法都有对应的 set 方法(例如 getFullYear() 和 setFullYear())。大多数方法也有对应的 [UTC] 版本(例如 getUTCFullYear())。
| 方法 | 描述(除非另有说明,否则为本地时间) |
|---|---|
getDate() / setDate(day) | 获取/设置指定日期对应的月份中的日期 (1-31),根据本地时间。 |
getDay() | 获取指定日期对应的一周中的星期几(0 表示星期日,1 表示星期一,…,6 表示星期六),根据本地时间。 |
getFullYear() / setFullYear(year[, month[, day]]) | 获取/设置指定日期对应的完整年份(4 位数),根据本地时间。 |
getHours() / setHours(hours[, min[, sec[, ms]]]) | 获取/设置指定日期对应的小时数 (0-23),根据本地时间。 |
getMilliseconds() / setMilliseconds(ms) | 获取/设置指定日期对应的毫秒数 (0-999),根据本地时间。 |
getMinutes() / setMinutes(min[, sec[, ms]]]) | 获取/设置指定日期对应的分钟数 (0-59),根据本地时间。 |
getMonth() / setMonth(month[, day]) | 获取/设置指定日期对应的月份 (0-11),根据本地时间。(0-indexed!) |
getSeconds() / setSeconds(sec[, ms]) | 获取/设置指定日期对应的秒数 (0-59),根据本地时间。 |
getTime() / setTime(milliseconds) | 获取/设置指定日期的数值,表示自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的毫秒数。 |
getTimezoneOffset() | 返回当前区域设置与 UTC 之间的时间区域偏移量(以分钟为单位)。(例如,UTC-5 返回 300)。 |
toDateString() | 返回 Date 对象的“日期”部分,表示为人类可读的字符串(例如,“Fri Jul 26 2024”)。 |
toISOString() | 返回一个遵循简化扩展 ISO 格式(ISO 8601)的字符串,长度始终为 24 或 27 个字符(YYYY-MM-DDTHH:mm:ss.sssZ 或 ±YYYYYY-MM-DDTHH:mm:ss.sssZ)。时区始终是零 UTC 偏移量,以后缀“Z”表示。 |
toLocaleDateString([locales[, options]]) | 使用区域设置约定,将 Date 对象的“日期”部分返回为字符串。 |
toLocaleString([locales[, options]]) | 使用区域设置约定,返回表示日期和时间的字符串。 |
toLocaleTimeString([locales[, options]]) | 使用区域设置约定,将 Date 对象的“时间”部分返回为字符串。 |
toString() | 返回表示指定 Date 对象的字符串(格式取决于实现,通常包含时区)。 |
toTimeString() | 返回 Date 对象的“时间”部分,表示为人类可读的字符串(例如,“14:45:30 GMT+0200 (Central European Summer Time)”)。 |
toUTCString() | 使用 UTC 时区约定将日期转换为字符串(例如,“Fri, 26 Jul 2024 12:45:30 GMT”)。 |
valueOf() | 返回 Date 对象的原始值(自 epoch 以来的毫秒数),与 getTime() 相同。 |
示例:使用 Date 方法
Section titled “示例:使用 Date 方法”const today = new Date(); // 当前日期和时间
console.log('Full Year:', today.getFullYear());console.log('Month (0-indexed):', today.getMonth()); // 0 表示一月,1 表示二月...console.log('Day of Month:', today.getDate());console.log('Hours:', today.getHours());console.log('Minutes:', today.getMinutes());console.log('Seconds:', today.getSeconds());
console.log('Milliseconds since epoch:', today.getTime());
console.log('ISO String:', today.toISOString());console.log('Locale Date String (US):', today.toLocaleDateString('en-US'));console.log('Locale Time String (US):', today.toLocaleTimeString('en-US', { hour12: true, hour: 'numeric', minute: '2-digit' }));
// 设置日期的部分const eventDate = new Date();eventDate.setMonth(11); // 设置月份为十二月 (11)eventDate.setDate(25); // 设置日期为 25 号console.log('Event Date (Christmas):', eventDate.toDateString()); // 圣诞节- 基于 0 的月份索引:
getMonth()返回 0 表示一月,1 表示二月,…,11 表示十二月。使用setMonth()设置月份时,同样适用基于 0 的索引。这是常见的错误来源。 - 时区:JavaScript
Date对象本质上会根据用户的系统设置来处理本地时间方法的时区。在跨区域处理日期时要注意这一点。UTC 方法(getUTCDate()、setUTCHours()等)使用[协调世界时 (UTC)],避免了本地时区的歧义。 - 日期字符串解析:如前所述,
new Date(dateString)可能不一致。建议优先使用 [ISO 8601] 或基于组件的构造函数,或者使用库进行可靠的解析。 - 可变性:
Date对象是可变的。setDate()、setFullYear()等方法会修改原始的Date对象。如果需要保留原始日期,请先从中创建一个新的Date对象(例如,const newDate = new Date(oldDate.getTime());)。
对于更高级的日期和时间操作、国际化或时区处理,请考虑使用成熟的库,如 date-fns、Day.js 或 Luxon。它们提供了比原生 Date 对象更多的功能和更友好的 [API]。