03月09, 2019

JS基础(6)——对象(5)——Date 对象

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 点到给定日期的毫秒数。

该方法会根据日期时间字符串格式规则来解析字符串的格式,除了标准格式外,以下格式也支持。

  1. '月/日/年' 如 6/13/2004

  2. '月 日,年' 如 January 12,2004 或 Jan 12,2004

  3. '星期 月 日 年 时:分:秒 时区' 如 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():返回距离 1970110 点的毫秒数,同 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

本文链接:http://www.yanhongzhi.com/post/js-basis-21.html

-- EOF --

Comments