Date 对象主要是用于处理和时间相关的操作。
6-5-1 时间戳
在学习 Date 对象之前,有一个概念必须要了解,那就是时间戳。
所谓时间戳,就是指从 1970 年 1 月 1 日 0 时 0 分 0 秒到现在为止的秒数。在计算机里面,进行时间的计算都是通过时间戳来进行计算的。计算完成以后再将时间戳转换为表示时间的字符串。
获取时间戳
比起其他编程语言,在 ECMAScript 中所获取到的时间戳的精度要更高一些,可以精确到毫秒。
通过以下的方式可以获取到时间戳:
let now = Date.now();
console.log(now); // 1511767644238
如果想要得到秒数,可以使用得到的毫秒数除以 1000,然后四舍五入,如下:
let now = Date.now();
now = Math.round(now / 1000); // 毫秒除以 1000,四舍五入后得到秒数
console.log(now); // 1511767768
6-5-2 静态方法(扩展)
可以看到,上面的Date.now()
就是一个静态方法(直接从类上面调用的方法)。除了这个方法以外,这里还要介绍两个静态方法,分别是Date.parse()
和Date.UTC()
。
Date.parse()
方法
该方法用于解析一个日期字符串,参数是一个包含待解析的日期和时间的字符串,返回从 1970 年 1 月 1 日 0 点到给定日期的毫秒数。
该方法会根据日期时间字符串格式规则来解析字符串的格式,除了标准格式外,以下格式也支持。
'月/日/年' 如 6/13/2004
'月 日,年' 如 January 12,2004 或 Jan 12,2004
'星期 月 日 年 时:分:秒 时区' 如 Tue May 25 2004 00:00:00 GMT-0700
如果字符串无法识别,将返回 NaN
注:浏览器不支持不表示日期只表示时间的字符串格式
console.log(Date.parse("1990/03/23")); // 638121600000
console.log(Date.parse("March 23,1990")); // 638121600000
console.log(Date.parse("2017")); // 1483228800000
console.log(Date.parse("Hello")); // NaN
注:在 ECMAScript5 中,如果使用标准的日期时间字符串格式规则的字符串中,数学前有前置 0,则会解析为 UTC 时间,时间没有前置 0,则会解析为本地时间。其他情况一般都会解析为本地时间。
UTC 时间:协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称 UTC。
协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。
Date.UTC()
方法
Date.UTC()
同样返回给定日期的毫秒数,但其参数并不是一个字符串,而是分别代表年、月、日、时、分、秒、毫秒的数字参数,说白了就是参数的形式和上面不一样。
Date.UTC()
方法的具体语法如下:
Date.UTC(year,month,day,hours,minutes,seconds,ms)
其中 year 参数是固定的,其余参数都是可选的,我们可以通过函数的 length 属性来查看该函数的形式参数个数。
console.log(Date.UTC.length); // 7
注:该方法使用的是 UTC 时间,而不是本地时间。
console.log(Date.UTC("1990/03/23")); // NaN
console.log(Date.UTC(1990,3,23)); // 640828800000
console.log(Date.UTC(2017)); // 1483228800000
console.log(Date.UTC("Hello")); // NaN
6-5-3 日期对象构造函数
日期对象的构造函数为Date()
。该构造函数根据使用的不同效果也不尽相同。
不使用 new 关键字
如果不使用new
关键字,那么就只是单纯的函数调用。会返回一个当前的日期和时间的字符串表示。并且被当作函数调用时,会忽略所有传递进去的参数,如下:
console.log(Date());
// Mon Nov 27 2017 16:03:33 GMT+0800 (CST)
console.log(Date("1990-03-23"));
// Mon Nov 27 2017 16:03:33 GMT+0800 (CST)
使用 new 关键字
如果使用new
关键字,那么这个时候就会返回一个对象。关于这种使用new
关键字创建对象的方式,我们会在后面进行详细的介绍,这是只是作为了解即可。
使用new
关键字但是没有传入任何参数,则会根据当前的日期时间来创建一个date
对象。
let date = new Date();
console.log(date); // 2017-11-27T08:05:44.025Z
console.log(typeof date); // object
如果传入数字参数,则该参数表示与 1970 年 1 月 1 日 0 时 0 分 0 秒之间的毫秒数,如下:
let date = new Date(638121600000);
console.log(date); // 1990-03-22T16:00:00.000Z
可以接收多个数字参数,这个时候形式有点类似于Date.UTC()
这个方法,不过返回的是一个对象,而不是毫秒数。
let date = new Date(1990,3,23);
console.log(date); // 1990-04-22T15:00:00.000Z
如果传入的是字符串参数,则返回该日期对象。如果字符串不能被解析为日期,则返回 Invalid Date
let date = new Date("1990-03-23");
console.log(date); // 1990-03-23T00:00:00.000Z
let date2 = new Date("Hello");
console.log(date2); // Invalid Date
6-5-5 实例方法
Date 对象没有可以直接读写的属性,所有对日期和时间的访问都需要通过方法。
Date 对象的大多数方法分为两种形式:一种是使用本地时间,一种是使用 UTC 时间,这些方法会在下面一起列出。其中,所列出的get[UTC]Day()
方法同时代表getDay()
方法和getUTCDay()
方法。
Date 对象一共有 46 个实例方法,可以分为以下 3 类:to 类、get 类 和 set 类。
因为 Date 对象的实例方法个数太多,而大多数实例方法在使用的时候都是非常相似的,所以我们这里只选择个别方法进行演示。
1. to 类
to 类方法从 Date 对象返回一个字符串,表示指定的时间。常见的 to 类方法如下:
toString():方法返回本地时区的日期字符串。
toUTCString():方法返回 UTC 时间的日期字符串。
toISOString():返回 Date 对象的标准的日期时间字符串格式的字符串。
toDateString():返回 Date 对象的日期部分的字符串。
toTimeString():返回 Date 对象的时间部分的字符串。
toJSON():返回一个符合 JSON 格式的日期字符串,与 toISOString() 方法的返回结果完全相同。
toLocaleString():toString() 方法的本地化转换。
toLocaleTimeString():toTimeString() 方法的本地化转换。
toLocaleDateString():toDateString() 方法的本地化转换。
个别方法演示:
console.log(new Date("1990-03-23").toString());
// Fri Mar 23 1990 08:00:00 GMT+0800 (CST)
console.log(new Date("1990-03-23").toDateString()); // Fri Mar 23 1990
console.log(new Date("1990-03-23").toTimeString()); // 08:00:00 GMT+0800 (CST)
console.log(new Date("1990-03-23").toLocaleString()); // 1990-3-23 08:00:00
2. get 类
Date 对象提供了一系列 get 类方法,用来获取实例对象某个方面的值。
在介绍 get 类方法之前,介绍一下valueOf()
方法。该方法返回距离 1970 年 1 月 1 日 0 点的毫秒数。因此,可以方便地使用比较运算符来比较日期值。
let date1 = new Date(1990, 3, 23).valueOf();
let date2 = new Date(1988, 8, 21).valueOf();
console.log(date1); // 640796400000
console.log(date2); // 590774400000
console.log(date1 > date2); // true
常见的 get 类方法如下:
getTime():返回距离 1970 年 1 月 1 日 0 点的毫秒数,同 valueOf()。
在 ECMAScript5 之前,可以使用 getTime() 方法来实现 Date.now() 方法。
getTimezoneOffset():返回格林威治时间和本地时间之间的时差,以分钟为单位。
getYear():返回距离 1900 年的年数(已过时)。
get[UTC]FullYear():返回年份(4位数)。
get[UTC]Month():返回月份(0 - 11)。
get[UTC]Date():返回第几天(1 - 31)。
get[UTC]Day():返回星期几(0 - 6)。
get[UTC]Hours():返回小时值(0 - 23)。
get[UTC]Minutes():返回分钟值(0 - 59)。
get[UTC]Seconds():返回秒值(0 - 59)。
get[UTC]Milliseconds():返回毫秒值(0 - 999)。
注意:通过标准日期时间格式字符串,且有前置 0 的形式的参数设置,设置的是 UTC 时间。
个别方法演示:
console.log(new Date("1990-03-23").valueOf()); // 638150400000
console.log(new Date("1990-03-23").getTime()); // 638150400000
console.log(new Date("1990-03-23").getDay()); // 5
console.log(new Date("1990-03-23").getMonth()); // 2
3. set 类
Date 对象提供了一系列 set 类方法,用来设置实例对象各个方面的值。
set 方法基本与 get 方法相似,传入类似于Date.UTC()
的参数,返回调整后的日期的内部毫秒数。
注意:星期只能获取,不能设置。
setTime():使用毫秒的格式,设置一个 Date 对象的值。
setYear():设置年份(已过时)。
set[UTC]FullYear():设置年份(4 位数),以及可选的月份值和日期值。
set[UTC]Month():设置月份(0 - 11),以及可选的日期值。
set[UTC]Date():设置第几天(1 - 31)。
set[UTC]Hours():设置小时值(0 - 23),以及可选的分钟值、秒值及毫秒值。
set[UTC]Minutes():设置分钟值(0 - 59),以及可选的秒值及毫秒值。
set[UTC]Seconds():设置秒值(0 - 59),以及可选的毫秒值。
set[UTC]Milliseconds():设置毫秒值(0 - 999)。
个别方法演示:
let date = new Date("1990-03-23");
console.log(date.setFullYear(1992),date.getFullYear());
// 701308800000 1992
console.log(date.setMonth(4),date.getMonth());
// 706579200000 4
Comments