Skip to content

ES6 - Date 对象

JavaScript 提供了一个内置的 Date 对象用于处理日期和时间。Date 对象是使用 new Date() 构造函数创建的。

一旦创建了 Date 对象,就可以使用许多方法来获取和设置其组成部分(年、月、日、时、分、秒、毫秒),可以使用本地时间或[协调世界时 (UTC)]。

ECMAScript 标准规定,Date 对象可以表示从 [UNIX epoch (1970 年 1 月 1 日,UTC)] 起,在约 ±273,785 年范围内的任何日期和时间,精度达到毫秒级。

有几种方法可以创建 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 实例上常用方法的列表。大多数 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() 相同。
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]。