Date是javascript中的援用数据范例之一,假如要处置惩罚日期、时候,平常都邑用到Date范例。不过,要正确地运用Date,还应当相识日期和时候有关的观点。就从Date范例的要领最先吧。
建立Date
下面这段代码用了差别的情势,建立了一个名为teaTime
的变量,并赋值为Date范例值,时候是近来的某一个时候点:
// one way
var teaTime = new Date("Aug 21 2014 16:40:14");
// equivalent to...
var teaTime = new Date(2014, 7, 21, 16, 40, 14);
个中,组织函数Date
传入了两种参数,来赋值给teaTime
。不过,它们的效果是雷同的,都代表同一个时候点。现实上,组织函数Date
吸收的参数是一个从1970年1月1日凌晨0点到愿望设定的时候点的毫秒数(可认为负,示意在此之前)。上面的例子为何可行呢?这是因为关于第一种字符串情势的单个参数,会在背景先挪用Date.parse()
要领转化为毫秒数。相似的,第二种数字情势的多个参数(你能够还发明了月份是以数字0~11来示意的),会在背景挪用Date.UTC()
要领转化为毫秒数。
UTC?这是什么?
UTC
UTC是指谐和天下时,是最主要的天下时候规范。这个缩写也是有泉源的,英语中它是CUT(Cooordinated Universal Time),而法语中它是TUC(Temps Universel Coordonné),因为被愿望谐和天下时在一切言语中有一致的缩写,末了让步运用了这个[UTC][](居然让步了!)。
UTC是以[原子时][]秒长为基础的。或许你另有印象,在国际单元制(SI)中,只要7个基础单元,秒(s)就是个中之一,用的就是原子时。因而,UTC充足准确,被作为当今运用的规范时候。
与UTC异常有关的是另一个经常被说起的时候规范,GMT。
GMT
GMT是指格林尼治规范时候,它对应位于英国伦敦郊区的皇家格林威治天文台的规范时候。[GMT][](Greenwich Mean Time)受地球自转影响,能够有较大偏差,因而GMT已不再被作为规范时候运用(也就是说,现在用UTC作为规范)。不过,假如不斟酌小于0.9秒的差别,GMT和UTC的时候能够认为是一样的。
Date.parse()可用的字符串花样
从前文能够晓得,因为并不轻易直接传入一个相关于1970年1月1日凌晨0点的毫秒数,一般我们都用Date.parse()
和Date.UTC()
所支撑的参数情势。个中,Date.parse()
是吸收示意日期的字符串参数,假如花样不对,将返回NaN
。
Date.parse()
可用的示意日期的字符串包含RFC2822[]。另外,能够会支撑一些其他的花样,但因区域、浏览器差别,不能确保可用(所以,发起不运用)。
个中,ISO 8601的花样,比方下面如许的写法:
var teaTime = new Date("2014-08-21T18:11:35");
只要兼容ECMAScript 5的浏览器才可用。以我本身的测试效果而言,IE8及以下不支撑(返回NaN
),请注重。
当前时候
Date
组织函数的另一个异常经常使用的用法是,不通报参数,这时候,新建立的对象将自动取得当前日期和时候。因为这里取得的当前时候是运转javascript的装备的体系时候,所以假如你本身手工更改了体系时候至不和真实状况一致,则javascript返回的效果也一样不和真实状况一致。
在指定时候内壅塞javascript代码,能够用Date完成:
var start = new Date();
while (new Date() - start < 1000) {
// wait 1 second...
};
这能够用于某些测试。
超出范围的时候值
假如运用超出范围的时候值,差别的浏览器会有差别的处置惩罚。比方,在写本文的时候点,我测试了Aug 20 2014 15:75:32
如许的值,Firefox 31会将其处置惩罚为Aug 20 2014 16:15:32
,Chrome 36和IE9+返回Invalid Date
,IE8-返回NaN
。
可见,要保证一般运转,最好的做法是保证输入的就是正当的时候值。
不运用new关键字的状况
假如不运用关键字new
,也就是说,直接挪用Date()
,则不管传什么参数,都返回一个String
字符串数据,其内容是当前时候,相当于Date.now().toString()
的效果:
// will get a string like "Fri Aug 22 2014 10:10:08 GMT+0800"
var teaTime = Date("Aldnoah Zero");
显现一致的时候信息
运用Date范例,平常是为了在页面中显现时候信息。不过,现实状况是,Date范例一切的将日期花样化为字符串的要领,包含toString()
和toLocaleString()
,其效果都因浏览器差别而差别。因而,假如要显现一致的时候信息,应当运用getFullYear()
、getMonth()
等get要领顺次猎取时候中的数字信息,然后本身以字符串组合的体式格局来构成本身想要的时候信息。比方:
var time = new Date("Aug 22 2014 16:40:54"),
timeString = "";
timeString += time.getFullYear() + "-";
timeString += (time.getMonth() + 1) + "-";
timeString += time.getDate() + " ";
timeString += time.getHours() + ":";
timeString += time.getMinutes() + ":";
timeString += time.getSeconds();
alert(timeString); // 2014-8-22 16:40:54 in all browsers
须要注重的是,get要领有相似getUTCHours()
和getHours()
如许以UTC作为离别的状况。UTC系列的get要领返回的是前面所说的天下规范时候,时区上说就是零时区。而不带UTC的get要领返回的是当地时候。因为我们平常会用到的时候都是当地时候(比方国内是东八区,记为UTC/GMT +0800),所以基础只会用到getHours()
这类情势的要领。
有关细致的Date范例的要领,请参考[MDN对Date的诠释][]。
取得时区信息
Date范例有一个getTimezoneOffset()
的要领,它能够用来剖析当地与UTC时候之间的时差。比方我本身这里挪用的效果:
// -480 while I'm in china
var hereTimeOffset = new Date().getTimezoneOffset();
它的效果是当地时候和UTC时候相差的分钟数(而且是 UTC – 当地时候)。假如这个“当地”进入夏令时,这个值会有变化。
什么是夏令时?
DST
DST是指夏令时候,也叫做日光勤俭时候(Daylight saving time)。它是由部份国度所执行的在一年中的某一时候段(以夏日为中间,比方美国的4月到10月)内,将时候拨快1小时,以充分利用夏日较长的日光时候,勤俭能源的时候轨制。在执行夏令时的国度中,差别国度也会有差别的夏令时执行日期。
为何说DST会影响到getTimezoneOffset()
这个值呢,看看Windows 7里的日期和时候选项:
可见,夏令时已被集成在体系内,会对应地转变体系时候,从而影响效果。不过,你能够从上面看到,中国未执行夏令时,所以没必要忧郁受到影响,在此相识一下就能够了。
倒计时的制造要领
怎样制造一个倒计时?
起首,须要明白的是,javascript的每个Date对象示意的虽然是一个时候点,看起来包含年月日时分秒等多重信息,但它现实是由单个数字信息表现的,这个数字就是相关于1970年1月1日凌晨0点UTC的毫秒数。因而,将时候点对应的毫秒数,做减法,然后将差值效果(也是毫秒数)顺次转化为其他差别级别的时候单元,就能够获得倒计时信息。
你能够参考[How to create a simple javascript countdown timer][]。
结语
近来在完成某个日期和时候有关的功用时,发明本身对诸如UTC如许的观点都没有什么印象。所以,坚决地本身补习了一下,然后整顿成了这篇文章。
(从新编辑自我的博客,原文地点:http://acgtofe.com/posts/2014/08/a-tale-of-date)