“Date(日期)”对象

“Date(日期)”对象

本文介绍了Date(日期)对象。

我们将通过具体示例,逐步讲解Date对象,从基础机制到实际工作中常用的操作。

YouTube Video

“Date(日期)”对象

什么是Date(日期)对象?

JavaScript的Date对象是用于处理日期和时间的标准对象。在内部,它基于自1970年1月1日00:00:00 UTC以来经过的毫秒数来管理日期和时间。

首先,让我们创建一个表示当前日期和时间的 Date 对象,并检查其内容。

1const now = new Date();
2console.log(now);
  • 此代码创建一个表示当前执行时刻日期和时间的Date对象。显示格式取决于执行环境,如浏览器或操作系统。

如何创建Date对象

可以根据需求通过多种方式创建Date对象。一个特别容易出错的重要点是:构造函数中的“月”参数是从0开始的(零基),也就是说月份从0开始计数。

1const d1 = new Date();                     // Current date and time
2const d2 = new Date("2025-01-01");         // Create from an ISO date string
3const d3 = new Date(2025, 0, 1);           // January 1, 2025 (month is zero-based)
4const d4 = new Date(2025, 0, 1, 10, 30);   // January 1, 2025, 10:30
5
6console.log(d1, d2, d3, d4);
  • 在new Date(year, month, day)中,month表示0是1月,11是12月。如果不了解这一规定,可能会无意中创建出相差一个月的日期,因此务必小心。

获取日期和时间的各个部分

你可以从 Date 对象中分别获取年份、月份、日期、时间和星期。所有getter方法都会以数字形式返回值。

1const date = new Date();
2
3console.log(date.getFullYear()); // Year
4console.log(date.getMonth());    // Month (0-based: 0 = January)
5console.log(date.getDate());     // Day of the month
6console.log(date.getHours());    // Hours
7console.log(date.getMinutes());  // Minutes
8console.log(date.getSeconds());  // Seconds
9console.log(date.getDay());      // Day of the week (0 = Sunday, 6 = Saturday)
  • 同样需要注意,getMonth()方法返回的月份也是从0开始的。在用于显示时,通常需要加1以调整为人类习惯的月份值。
  • getDay() 会以数字形式返回星期几。0 表示星期天,6 表示星期六。

修改日期和时间

Date对象是可变对象,这意味着你可以在之后更改它的值。此特性很有用,但要注意可能带来的意外副作用。

你可以使用 set 方法来更改现有 Date 对象的值。

1const date = new Date("2025-01-01");
2
3date.setFullYear(2026);
4date.setMonth(5);   // June
5date.setDate(15);
6
7console.log(date);
  • setMonth()方法的参数同样也是从0开始的。原始对象会被直接修改。

日期的加减计算

常见的日期计算方式是用毫秒数或使用setDate()方法。在基于天数的计算中,使用setDate()方法特别直观且安全。

1const date = new Date("2025-01-01");
2
3date.setDate(date.getDate() + 7);
4console.log(date);
  • 在这个例子中,我们计算了指定日期之后7天的日期。即使跨越了新的月份,系统也会自动调整日期。

比较Date对象

Date对象可以像数字一样进行比较。这是因为比较的实际上是其内部的毫秒值。

1const a = new Date("2025-01-01");
2const b = new Date("2025-01-10");
3
4console.log(a < b);   // true
5console.log(a > b);   // false
  • 如果要判断日期的先后顺序,无需进行额外的转换。你可以直接使用比较运算符。

操作时间戳(毫秒数)

Date对象可以与表示毫秒数(时间戳)的数字互相转换。这种格式在API或数据库集成中经常被使用。

1const now = Date.now();
2console.log(now);
3
4const date = new Date(now);
5console.log(date);
  • Date.now()方法返回当前时间的毫秒数。当你希望以数字方式存储或比较时间时,这非常有用。

将日期格式化为字符串

直接显示Date对象通常会得到不符合需求的格式。因此,应该根据需求手动进行格式化。

1const date = new Date("2025-01-01");
2
3const formatted = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
4console.log(formatted);
  • 通过手动格式化,可以完全掌控日期的显示格式。在实际工作中,通常会使用库来实现日期格式化。

UTC时间与本地时间的区别

Date对象提供了处理本地时间和UTC时间的方法。要确保与服务器集成及国际化兼容,正确理解这一差异非常重要。

1const date = new Date();
2
3console.log(date.getHours());    // Local time (hours)
4console.log(date.getUTCHours()); // UTC time (hours)
  • getUTC*系列方法返回的总是基于UTC的值。在处理跨时区的数据时要格外小心。

使用Date对象时的注意事项

Date对象虽然方便,但也有一些容易踩坑的地方。特别是月份的零基索引和对象的可变性,常常引发bug。

让我们通过下面的具体例子来看看 Date 是可变对象这一事实的影响。

1const original = new Date("2025-01-01");
2const copy = new Date(original);
3
4copy.setDate(10);
5
6console.log(original);
7console.log(copy);
  • 如果需要保留原始的日期和时间,一定要先创建副本。只需注意这一点,就能有效避免意外的bug。

Date 难以处理的原因以及选择库时的标准

Date 对象作为标准功能提供了足够的特性,但在实际使用中有时会变得难以使用。典型问题包括月份和星期是从零开始的、容易混淆本地时间和UTC,以及对象是可变的这一事实。随着日期处理的增加,这些问题可能会导致更多的错误。

Date 足以应对简单的日期获取和比较,但如果涉及更多日期计算或显示格式化,代码的可读性和可维护性往往会降低。

如果你有如下需求,建议考虑使用如 dayjsdate-fns 这样的轻量级日期库。

  • 你需要显式地处理时区
  • 你经常需要进行日期或时间间隔的计算
  • 你希望能够灵活地更改显示格式
  • 你希望以不可变的方式处理日期和时间

总结

Date对象是JavaScript中处理日期和时间的最基本工具。理解Date对象的特殊性,并正确进行创建、获取、计算和格式化,就能在实际工作中安全使用它。

掌握基础后,根据需要选择使用日期库是更实用的方案。

您可以在我们的YouTube频道上使用Visual Studio Code跟随上述文章进行学习。 请也查看我们的YouTube频道。

YouTube Video