GMT & UTC
某一时刻在全球任何地方应该是唯一的,时区的不同是为了让地球不同时区的人中午十二点都是太阳正当午,形成交流上没有障碍。标准是格林威治标准时间(GMT,Greenwich Mean Time,世界时),GMT时间的准确度为每天数毫秒。
为进一步精确时间,协调世界时(UTC,Coordinated Universal Time)出现,其准确度为每日数纳秒。UTC用1970年1月1日午夜(零时)开始经过毫秒数来保存日期。
Date类
构造函数new Date()
传参
Date构造函数无参情况下,实例化对象自动获得当前日期和时间。若想根据特定日期和时间创建日期对象,必须传入表示该日期的毫秒数(从UTC时间1970年1月1日午夜起止该日期止的毫秒数,时间戳)。所以new Date(0)
即为UTC时间的1970年1月1日00:00:00:000。
new Date(0)
Date传入表示时间的字符串,则会自动调用ECMAScript的Date.parse()
将字符串转化为对应距离GMT标准时间的毫秒数。然而,Date.parse()
的行为因实现因地区而异,对跨域跨平台是隐患,不推荐时间。
new Date("May 24,2018")
new Date(Date.parse("May 24,2018"))
同模仿Date.parse()
一样,Date构造函数也会模仿Date.UTC()
。Date.UTC()
返回表示日期的毫秒数,与 Date.parse()
在构建值时使用不同的信息。 Date.UTC()
的参数分别是年份、基于0的月份、月中天数(1至31)、小时(0至23)、分钟、秒、毫秒。其中,年和月是必须的,若没有提供月中天数默认为1,若参数均省略则默认均为0。
new Date(Date.UTC(2000,0));//GMT的2000年1月1日午夜零时
new Date(Date.UTC(2018,4,5,12,22,30));//GMT的2018年4月5日12点22分30秒
new Date(2018,1,1,12,21,40)
和 new Date(Date.UTC(2018,1,1,12,21,40))
创建的并非同一时刻的Date类,new Date()
日期和时间是基于本地时区而非GMT,即创建的是本地时间2018年2月1日12点21分40秒。此外要根据代码执行环境所处时区,若位于中国(GMT+08),则对应的是GMT时间2018年2月1日04点21分40秒。
ISODate
# 标准UTC时间格式
> new Date()
< Thu Jan 11 2018 17:02:58 GMT+0800 (中国标准时间)
ISO 8601扩展格式为 YYYY-MM-DDTHH:mm:ss.sssZ
,在兼容ECMAScript5的实现才支持此格式。
在MongoDB中时间保存格式为ISODate
类型,由于MongoDB中的date类型以UTC存储,即GMT时间。
> new Date()
ISODate("2018-01-11T09:09:15.927Z") //2018年1月11日17点09分15秒
ISOdate可直接使用new Date()
进行比较,直接使用+8
后即可。