JS基础--Date.parse(),Date.UTC()和Date.now()

一. UTC和GMT的关系

什么是GMT?

格林尼治标准时间(Greenwich Mean Time,GMT)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。 地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。
总结:GMT是曾经用过的不那么精准的标准时间。

什么是UTC?

UTC是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。又称协调世界时、世界统一时间、世界标准时间、国际协调时间。
总结:UTC才是目前应用的真正的精准的标准时间。

GMT和UTC的关系?

为了方便,在不需要精确到秒的情况下,通常将GMT 和UTC 视作等同。
总结:所以,小伙伴们懂了吧,这两个货基本上是一样的。

二. Date.parse()和Date.UTC()的来源

创建当前时间对象

首先,我们知道创建一个新的时间对象的方法是:

/*  Chrome输出结果为
	Fri Apr 26 2019 12:40:24 GMT+0800 (China Standard Time) 
	Firefox输出结果为
	2019-04-26T04:40:24.000Z*/
 var date = new Date();  

我们可以看到无论是Chrome还是Firefox,new Date()时都默认输出当前时间。
只不过Chrome输出的是本地时间(即GMT+0800),而Firefox输出的是UTC时间,比本地时间少8个小时。

那如果我们不想输出当前时间,而想创建一个指定时间的Date对象呢?

这里我们传入指定时间的毫秒数(即从UTC时间1970年1月1日午夜起至该日期止经过的毫秒数)。

/*  Chrome输出结果为
	Fri Apr 26 2019 12:40:24 GMT+0800 (China Standard Time) 
	Firefox输出结果为
	2019-04-26T04:40:24.000Z*/
date = new Date(1556253624000)

可是这样就会给我们带来计算上的麻烦,所以为了简化毫秒计算的过程,ECMAScript提供了两个方法:Date.parse()Date.UTC().

三. Date.parse()

ECMA-262没有定义Date.parse()应该支持哪种日期格式,因此这个方法的行为因实现而异,而且通常因地区而异。
下面列出了几种常见的时间格式:

// 返回UTC时间
Date.parse("2019-04-26T00:00:00.000Z"); // 1556236800000
Date.parse("2019-04-26"); // 1556236800000

// 返回本地时间(即UTC+8h)
Date.parse("2019-4-26"); // 1556208000000
Date.parse("2019-4-26 00:00:00"); // 1556208000000
Date.parse("2019-04-26 00:00:00"); // 1556208000000
Date.parse("4/26/2019"); // 1556208000000
Date.parse("April 26, 2019"); // 1556208000000
Date.parse("Fri Apr 26 2019 00:00:00 GMT+0800"); // 1556208000000
Date.parse("2019, 4, 26"); // 1556208000000
Date.parse("2019, 04, 26"); // 1556208000000

/*  Chrome输出结果为
	Fri Apr 26 2019 08:00:00 GMT+0800 (China Standard Time)
	Firefox输出结果为
	2019-04-26T00:00:00.000Z*/
new Date(1556236800000);

/*  Chrome输出结果为
	Fri Apr 26 2019 00:00:00 GMT+0800 (China Standard Time)
	Firefox输出结果为
	2019-04-25T16:00:00.000Z*/
new Date(1556208000000);

可以看到只有字符串为 YYYY-MM-DD 形式和 YYYY-MM-DDTHH-mm-ss.sssZ 格式的时候,才会返回UTC时间,其他格式都会默认传入的字符串描述的是本地时间,从而返回本地时间毫秒数。

还记得为什么会提供这个方法吗?
是为了简化new Date()时传入毫秒数的计算。

那么我们其实很容易想到这种写法:

// Chrome输出结果
new Date(Date.parse("2019-04-26T00:00:00.000Z")); // Fri Apr 26 2019 08:00:00 GMT+0800 (China Standard Time)
new Date(Date.parse("April 26, 2019")); // Fri Apr 26 2019 00:00:00 GMT+0800 (China Standard Time)

事实上我们可以在new Date()的时候直接将参数传给Date构造函数,后台会自动调用Date.parse()。下面这种写法和上面是一样的。

// Chrome输出结果
new Date("2019-04-26T00:00:00.000Z"); // Fri Apr 26 2019 08:00:00 GMT+0800 (China Standard Time)
new Date("April 26, 2019"); // Fri Apr 26 2019 00:00:00 GMT+0800 (China Standard Time)

四. Date.UTC()

Date.UTC()返回的是UTC时间的毫秒数。
传参格式如下:
Date.UTC(year,month,day,hours,minutes,seconds,ms)
注意:

  1. 年和月的值是必传的。
  2. 月份从0开始(一月是0,二月是1,三月是2,以此类推)。
  3. 如果没有提供天的参数,则默认为1,其他值不传时默认为0。
// 可以看出,当day不填时,默认为UTC时间4月1日
Date.UTC(2019, 3); // 1554076800000
Date.parse("2019-04-01T00:00:00.000Z"); // 1554076800000

Date.UTC(2019,3,26); // 1556236800000
Date.UTC(2019, 3, 26, 0, 0, 0, 0); // 1556236800000

如同Date.parse(),Date构造函数也会模仿Date.UTC(),但仍存在一点不同:
日期和时间都是基于本地时间创建,而非GMT时间!
例:

new Date(Date.UTC(2019,3)); // Mon Apr 01 2019 08:00:00 GMT+0800 (China Standard Time)
new Date(2019, 3); // Mon Apr 01 2019 00:00:00 GMT+0800 (China Standard Time)
new Date(Date.UTC(2019,2, 31, 16)); // Mon Apr 01 2019 00:00:00 GMT+0800 (China Standard Time)

五. Date.now()

ES5中,使用Date.now()可以返回当前时间的毫秒数,在不支持它的浏览器中,可以使用+new Date()的方式把Date对象转化为字符串,得到同样的结果。

Date.now(); // 1556345094801
+new Date(); // 1556345094801

你可能感兴趣的:(JS基础)