一. 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"); // 1554076800000Date.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基础--Date.parse(),Date.UTC()和Date.now()相关推荐

  1. Date.parse()方法以及应用

    Date.parse()方法 1.Date.parse()函数用于分析一个包含日期的字符串,并返回该日期与 1970 年 1 月 1 日午夜之间相差的毫秒数 Date.parse()的语法如下: Da ...

  2. t = Date.parse(new Date()) 解释一下这条代码的每一个单词的意思

    Date.parse() 是 JavaScript 中 Date 对象的一个方法,用来解析一个字符串参数,并返回自 1970 年 1 月 1 日起至该字符串表示的日期/时间之间的毫秒数. new Da ...

  3. 前端-JS基础之常用内置对象

    定时器 setTimeout() 用来指定某个函数或字符串在指定的毫秒数之后执行 只执行一次 clearTimeout() 清除定时器 /*setTimeout() 有两个参数1.执行体 注意:函数传 ...

  4. js基础知识(第二篇)

    面向对象概念 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了 程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台. 分布式系统.网络管 ...

  5. JS中Date.parse()和Date.UTC()返回值不一致

    Date.parse() 方法解析一个表示某个日期的字符串,并返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数,如果该字符串无法识别,或者一些情况下,包 ...

  6. js Date.parse()兼容性问题

    最近在做一个日历控件,网上copy了一段代码然后自己又改改. 标准浏览器下正常,结果ie全部不支持,搞不懂,原来Date.parse在IE下有兼容性问题 //beginData格式为'yyyy-mm- ...

  7. 【js基础】js获取时间戳(Date的总毫秒数)的4种方法

    1. 什么是时间戳 不是当前时间的毫秒数,而是距离1970年1月1日过了多少毫秒数. 2. 实现方法 2.1 valueOf() 代码: var date = new Date(); console. ...

  8. gettime 函数 java_关于java:如何使date.getTime()返回UTC时间?

    我有一个Date对象,它代表一个UTC时间. 当我使用getTime()方法获取此对象的长整型值时,返回的值对应于我们的当地时间(美国中部). 取回与原始UTC时间相对应的值的正确方法是什么? 谢谢 ...

  9. 美国的时间格式 -- 复杂格式的日期转换 使用Date.parse(“复杂的格式”)方法。

    使用这个方法 long time = Date.parse("Sun Feb 26 10:31:58 +0800 2012");SimpleDateFormat sdf=new S ...

最新文章

  1. java ip加密如何访问_java代码中如何实现http访问
  2. google 用新的tab打开网页
  3. Apache Mina2.x网络通信框架使用入门
  4. MySQL搭建主从复制 读写分离 分库分表 MyCat高可用
  5. SAP Spartacus express checkout 设计
  6. Android 系统(56)---Android 系统开机日志
  7. Spring Boot快速上手
  8. android 4.4.4版本拍照预览,在Android5.1及以下版本的手机上无法预览
  9. 1000并发的系统服务器配置,1000人并发服务器配置
  10. 【优化求解】基于matlab遗传算法求解电力系统最优潮流问题【含Matlab源码 437期】
  11. 案例分析:传统媒体如何借力微信平台推广
  12. 高精度绝对角度传感器应用高速度角度监测
  13. OEM、ODM模式区别
  14. rocky linux 8.5 基本设置
  15. python基础总结02
  16. 【BZOJ3772】精神污染 DFS序+主席树
  17. 加州房价预测项目详细笔记(Regression)——(3)准备数据(数据的预处理)
  18. 【nodejs】c++ addon 官方例子:nodejs调用c++
  19. 如何用将top命令的结果写入txt?
  20. 基于手机信令数据研究交通出行特征具体实现

热门文章

  1. Notepad++集成nasm编译器
  2. 二维码识别开源库-Quire码
  3. 刷路由器文件服务器打开失败,路由器升级错误引发网页打开失败故障
  4. python中tmp什么意思_python中temp是什么意思-问答-阿里云开发者社区-阿里云
  5. Luogu4495 [HAOI2018] 奇怪的背包 【扩展欧几里得算法】
  6. jquery--动态篇
  7. 浅谈Hybrid技术的设计与实现第二弹
  8. 怎样在virtualbox下WIN7共享XP的文件
  9. JS:ES6-1 let 关键字
  10. LeetCode(237)——删除链表中的节点(JavaScript)