一.概要
ECMAscript中的Date类型是早期根据Java的Java.until.Date类基础上构建的.Date类型使用自UTC(Coordinated Uiniversal Time,国际协调时间)1970年1月1日午夜(零时)开始经过的毫秒数来保存日期的.这种数据存储格式能够让Date类型保存的日期精确到1970年1月1日之前或之后的100000000年.
二.创建Date对象
我们知道创建对象是通过new操作符加构造函数Object()来创建的,由此可以得知date对象是new操作符结合构造函数Date()来创建的.结构如下:
var date = new Date();
在不传入参数的情况下,该变量所接收的Date()对象是自动获取当前日期和时间的.如果想创建特定的日期对象,则需要传入参数,这个参数就是该特定日期的毫秒数(即从UTC时间1970年1月1日午夜起到该特定日期止所经过的毫秒数).这似乎听起来有些不可思议.我们如何知道该特定日期的毫秒数呢?
为此,ECMAscript提供了两个方法:Date.parse()和Date.UTC().
-
Date.parse():这个方法接收一个表示日期的字符串参数,然后根据这个字符串参数返回相应的日期毫秒数.这个日期的格式可能会因地区而异,换句话说,就是在中国会以中国北京时间的格式,在美国会以美国的格式,如下图所示:
比如为2017年12月2日创建一个日期对象,代码如下图:
而实际上,不用在参数里写上这个方法也是可以的,也就是说以上示例等价于如下图所示:
如果所传的字符串参数不能表示日期,那么它就会返回NaN,这个构造函数所创建的对象也就会返回一个invalid date(无效日期).如下图所示:
日期对象在不同的浏览器实现中均有着奇怪的行为.比如:在解析"2018/1/32(按照常理是没有1月32号这个说法的,只会返回无效日期)",有的浏览器会将其解析为:"2018/2/1",而oprea则更加怪异,会返回当前的日期,比如现在是2018年3月5日,也就是说会返回"2018/3/5".如下图一些怪异行为(oprea浏览器测试的)所示:
2.Date.UTC():这个方法同样返回的是日期的毫秒数.它与Date.parse()方法的参数不同,它的参数还有一些复杂,即年份,基于0的月份(一月是0,二月是1,依次类推),月中的哪一天(1到31号),小时数(0到23),分钟,秒以及毫秒数.第一和第二个参数是必需的,如果没有提供第三个参数,则假设天数为1,如果省略其它参数,则通通假设为0.
如下图一个示例:
同样的,这个方法也可以被省略,与Date.parse()不同的是,日期和时间都是基于本地地区来创建而非GMT.不过参数是必须与这个方法一样的.如下图所示:
ECMAscript5还添加了Date.now()方法,表示调用这个方法的日期和时间的毫秒数 这个方法简化了Date对象分析代码的工作.如下图所示:
支持这个方法的浏览器有IE9,Firefox3+,safari3+,opera10.5+和chrome.在不支持它的浏览器中,可以使用+操作符获取Date对象的时间戳.代码如下:
上图也说明一个for循环至少要消耗3毫秒的时间.
三.继承方法
既然Date类型也是一个对象,那么对象所拥有的方法,Date类型也同样拥有.比如valueOf()方法,toString()方法,toLocaleString()方法.但是这三个方法返回的值却与其它引用类型返回的值有所不同.如下图所示:
从上图中可以看出,valueOf()方法主要返回的是日期的毫秒数.toLocaleString()返回的则是当前的日期时间,而toString()则返回GMT中国标准时间,当然具体的值还会因地区而异,同样的也会因浏览器而异.
我们可以从valueOf()方法返回的值中使用比较操作符进行比较,如下图所示:
如上图所示,我把当前时间同2018年3月6日做了一次比较,也就是同时使用valueOf()方法返回的毫秒数做比较.从常理来讲,2018年3月6日比当前日期时间(即2018/3/7....)是要小的,因此第一次比较自然就返回了false,第二次比较才返回true.这为我们比较日期提供了很大的方便.
Date类型除了以上的继承方法,也还有一些格式化为字符串的方法.主要包含以下:
-
toDateString():显示周几,月,日,年.如下图所示:
2.toTimeString():显示当前的GMT时间.如下图所示:
3.toLocaleDateString():显示年月日.如下图所示:
4.toLocaleTimeString():显示具体的某个时间(时,分,秒,也会指出是上午还是中午还是下午).如下图所示:
5.toUTCString():显示当前的GMT时间.如下图所示:
当然,以上方法所返回的值也会因浏览器和地区而异.另外为了保证兼容性,还有一个与toUTCString()方法等价的toGMTString()方法.这两个方法是等价的.如下图所示:
当然除了以上的日期格式化方法,还有一些日期时间组件方法,这些方法有点多,不必全部记忆,需要用到时翻阅资料查询即可.我也不必总结下来,不过,我记住了几个常用的,比如getTime(),表示获取当前的时间毫秒数,getFullYear(),表示获取年份.getDay(),获取天.getMonth()获取月份,getHour(),获取小时,getMinutes(),获取分钟,getSeconds()获取秒.