Skip to content

该构造函数用于进行和时间相关的处理

如果直接调用这个构造函数,会直接得到当前时间,以一个字符串的时间格式输出。

js
console.log(Date());//Tue Apr 02 2024 22:51:38 GMT+0800 (中国标准时间)

如果直接调用该函数,是无法传递参数的,哪怕传递了参数也会直接忽略,只能得到当前时间的字符串。这里获取到的时间也取决于系统的时区,这里由于我系统时区设置的是中国,所以得到了中国标准时间。

我们更常用的是使用 new 关键字,创建时间对象。

js
var time = new Date();
console.log(time,typeof time);//Tue Apr 02 2024 22:56:28 GMT+0800 (中国标准时间) 'object'

显然,这里虽然输出的是文本,但实际上是一个对象,但是如果直接调用 Date (),不使用 new 关键字,得到的就会是一个字符串,相当于 new Date().toString()

这个构造函数可以传入一些参数,根据不同的参数会返回不同的时间,详细规则如下:

  • 无参:当前时间
  • 一个数字类型的参数:传入的是时间戳,返回指定时间戳的时间
  • 一个字符串类型的参数:只要这个字符串符合 ISO 8601 格式,那么就可以被正确识别。
  • 一个日期对象的参数:复制一个相同的时间对象。
  • 两个参数及以上:分别为年、月、日、时、分、秒、毫秒。根据需要填入指定参数,主要,这里的月是从 0 开始的。如果省略参数,日期部分默认为 1,时分秒都默认为 0。这些参数都可以是负数,如果是负数,则会自动计算,或者说自动往前减。
js
console.log(new Date());//没有参数,获取当前时间
console.log(new Date(1234556));//一个数字参数,获取指定时间戳的时间
console.log(new Date("1970-01-01T12:00"));//该字符串符合ISO 8601,所以可以被正确识别
console.log(new Date(1999,4,20,0,0,0,0));//分别表示,年月日时分秒,其中月从0开始,所以这里实际上的时间是1999-05-20
console.log(new Date(1999,0,0,-2,0,0,0));//Wed Dec 30 1998 22:00:00 GMT+0800 (中国标准时间)
//很显然,这里日是从1开始,所以0日相当于往前推一天,而-2小时,相当于在原来的基础上减去两个小时。

时间戳

计算机里面的时间都是用时间戳存储的,所谓时间戳,就是一个实时变化的数字,它表示从 1970 年 1 月 1 日凌晨 00:00 到现在的时间,时间戳有两个版本,分别是秒级和毫秒级,秒级时间戳以秒为单位记录,毫秒级时间戳以毫秒为单位记录。计算机中一般是用毫秒级时间戳。既然如此,我们只要给定了一个时间戳,就能经过计算唯一确定一个时间。

有了时间对象之后,就可以用时间对象上的一些方法。

首先,我们这个日期对象,包含了年月日时分秒和毫秒,我们可以使用方法分别得到他们

  • Date.prototype.getFullYear():得到日期对象的年份
  • Date.prototype.getMonth():得到日期对象的月份(再次强调月份从 0 开始)
  • Date.prototype.getDate():得到日期对象的日
  • Date.prototype.getHours():得到日期对象的时
  • Date.prototype.getMinutes():得到日期对象的分
  • Date.prototype.getSeconds():得到日期对象的秒
  • Date.prototype.getMilliseconds():得到日期对象的毫秒
  • Date.prototype.getDay():得到日期对象处于星期几(星期 1 到星期 6 分别对应 1 到 6,星期天对应 0)
  • Date.prototype.getTime():得到日期对象的时间戳(毫秒级)

上面的所有方法,获取的时间都是基于当前时区的,如果要获取 0 时区的时间,在 get 后面加上 UTC,例如获取 0 时区的时,就是 getUTCHours

上面的所有函数都是用于获取时间,如果把 get 改成 set,就可以设置时间(可以为负数,往前推),设置时间传入的参数和 get 的返回值一致。(没有 setDay)
其中 setFullYear 可以传入三个参数,快速设置年月日。

接下来就是显示了,如何把一个时间对象变成一个可读性很强的字符串,我们人眼一眼就能看懂那种,很显然,可以通过前面的一堆方法自己写,但是 Date 对象内置了一些方法来帮助我们。

  • Date.prototype.toDateString():将日期部分转换为可读的字符串。(转换后还是英语)(要获得完整的,要用 toString())
  • Date.prototype.toISOString():将时间转换为 ISO 8601 标准的字符串。这个可读性比上面的强。
  • Date.prototype.toLocaleDateString():这个可读性最强,可以根据你操作系统的语言和地区,自动选择合适的展示方式来展示时间。(只展示日期部分)
  • Date.prototype.toLocaleTimeString():和上一个一样,只展示时间部分
  • Date.prototype.toLocaleString():和上两个一样,这个会展示完整信息

这几个函数得到的字符串往往不太理想,所以我们更多时候其实是自己写函数来完成日期转换

Date 对象有一个很神奇的功能,就是可以进行数学运算,我们最常见的操作是对两个日期相减,得到相间隔的时间戳。

为什么 Date 对象可以进行运算?对象进行运算的时候,会向原始类型进行转换,对象转换为原始类型的过程就是使用 valueOf 方法,但是 Date 对象重写了 valueOf 方法,Date 对象的 valueOf 方法返回的是时间戳,是一个数字,所以可以运算。
注意,Date 对象的加法操作不一样,两个 Date 对象的加法操作会视为字符串拼接,调用 toString() 方法,而非 valueOf() 方法,这一点非常特别。

这里做一个简单练习,获取当前时间,输出当前月份所有日期,并输入星期几。

js
/**
 * 打印当前月至下月1日之间的每一天的日期和星期。
 */
var date = new Date(); // 获取当前时间
date.setDate(1); // 将日期设置为当前月的1号
var month = date.getMonth(); // 获取当前月份
// 循环遍历从当前月1日到下月1日之间的每一天
while (date.getMonth() == month) {
    // 打印日期和星期,星期日对应7
    console.log(
        `${date.getFullYear()}年${
            date.getMonth() + 1
        }月${date.getDate()}日 星期${date.getDay() == 0 ? 7 : date.getDay()}`
    );
    date.setDate(date.getDate() + 1); // 将日期设置为下一天
}

以笔记为镜,可以知得失