Fork me on GitHub

高程5.3 Date类型

ECMAScript中的Date类型是在早期Java中的java.util.Date类的基础上构建的.因此,Date类型使用自UTC(Coordinated Universal Time)1970年1月1日零时开始经过的毫秒数来保存日期.

要创建一个日期对象,使用new操作符和Date构造函数即可.

var now=new Date();
    console.log(now);//输出类似Fri Nov 20 2015 13:44:07 GMT+0800(中国标准时间)

在调用Date构造函数而不传参的情况下,新创建的对象自动获得当前日期和时间.

如果想根据特定日期和时间创建日期对象,必须传入表示该日期的毫秒数(从1970年1月1日零时至该日期经过的毫秒数).

为了简化这个过程,提供了两个方法:Date.parse()和Date.UTC().

没有定义Date.parse()应该支持哪种日期格式,这个方法的行为因实现而异,因地区而异.

将地区设置为美国的浏览器通常都接受下列日期格式:

"月/日/年",如6/13/2015;

"英文月名 日,年",如January 12,2015;

“英文星期几 英文月名 日 年 时:分:秒 时区”,如Tue May 25 2015 00:00:00 GMT-0700.

例如,要为2015年5月25日创建一个日期对象,可以使用下面代码:

var someDate=new Date(Date.parse("May 25,2015"));
    console.log(someDate);//Mon May 25 2015 00:00:00 GMT+0800 (中国标准时间)

日期对象及其在不同浏览器中的实现有许多奇怪的行为.例如有一种是将超出范围的值替换成当前的值,以便于生成输出.

var someDate1=new Date(Date.parse("May 32,2015"));
    alert(someDate1);//IE和FF会弹出Mon Jun 01 2015 00:00:00 GMT+0800,而Chrome,Opera,Safari会弹出Invalid Date

Date.UTC()方法同样也返回表示日期的毫秒数,但它与Date.parse()在构建值时使用不同的信息.

Date.UTC()的参数分别是年份,基于0的月份(一月是0,二月是1,以此类推),月中那一天(1到31天),小时数(0到23),分钟,秒以及毫秒数.

在这些参数里,只能前两个参数(年和月)是必需的.如果没有提供月中的天数,则假设天数为1,如果省略其他参数,则统统假设为0.

var y2k=new Date(Date.UTC(2000,0));//传入的值一个表示年,一个表示月份
    console.log(y2k);//Sat Jan 01 2000 08:00:00 GMT+0800 (中国标准时间)

    var allFives=new Date(Date.UTC(2015,4,5,17,55,55));//五月为4,小时下午5点写为17
    console.log(allFives);//Wed May 06 2015 01:55:55 GMT+0800 (中国标准时间)

如同模仿Date.parse()一样,Date构造函数也会模仿Date.UTC(),但有一点明显不同:日期和时间都基于本地区而非GMT来创建.不过,Date构造函数接收的参数仍然与Date.UTC()相同.

因此,如果第一个参数是数值,Date()构造函数应付假设该值是日期中的年份,而第二个参数是月份,以此类推.

因此前面两个例子也可以如下写:

var y2k=new Date(2000,0);
    console.log(y2k);//Sat Jan 01 2000 00:00:00 GMT+0800 (中国标准时间)

    var allFives=new Date(2015,4,5,17,55,55);
    console.log(allFives);//Tue May 05 2015 17:55:55 GMT+0800 (中国标准时间)

以上代码创建了与前面例子相同的两个日期对象,只不过这次的日期都是基于系统设置的本地时区创建的.

ECMAScript 5添加了Date.now()就去,返回表示调用这个方法时的日期和时间的毫秒数.

这个方法简化了使用Date对象分析代码的工作.

例如:

//取得开始时间
    var start=Date.now();

    //调用函数
    doSomething();

    //取得停止时间
    var stop=Date.now();
        result=stop-start;

在不支持Date.now()的浏览器中,使用+操作符把Date对象转换成字符串,也可以达到同样的目的.

//取得开始时间
    var start=+Date.now();

    //调用函数
    doSomething();

    //取得停止时间
    var stop=+Date.now();
        result=stop-start;

5.3.1继承的方法

与其他引用类型一样,Date类型也重写了toLocaleString(),toString()和valueOf()方法,但这些方法返回值与其他类型的中的方法不同.

Date类型的toLocaleString()方法会按照与浏览器设置的地区相适应的格式返回日期和时间.

而toString()方法则通常返回带有时区信息的日期和时间,其中时间一般以军用时间(即小时的范围是0到23)表示.

toLocaleString()和toString()两种方法在不再的浏览器返回的日期和时间格式大不相同,事实上,它们的差别也仅在调试代码时比较有用,而在显示日期和时间时没有什么价值.

至于Date类型的valueOf()方法,则根本不返回字符串,而是返回日期的毫秒表示.因此,可以方便使用比较操作符来比较日期值.

var date1=new Date(2015,0,1);
    var date2=new Date(2015,1,1);

    console.log(date1<date2);//true
    console.log(date1>date2);//false

从逻辑上讲,2015年1月1日要早于2015年2月1日,此时如果我们说前者小于后者比较符合常理.但是表示2015年1月1日的毫秒数小于表示2015年2月1日的毫秒值,因此在比较两者大小时,第一个返回true,第二个返回false.

这样就为我们比较日期提供了极大方便.

5.3.2日期格式化方法

Date类型还有一些专门用于将日期格式化为字符串的方法,这些方法如下

toDateString()  以特定于实现的格式显示星期几,月,日和年;

toTimeString()  以特定于实现的格式显示时,分,秒和时区;

toLocalDateString()  以特定于地区的格式显示星期几,月,日和年;

toLocalTimeString()  以特定于实现的格式显示时,分,秒;

toUTCString()   以特定于实现的格式完整的UTC日期.

与toLocaleString()和toString()方法一样,以上这些字符串格式方法的输出也是因浏览器而异的,因此没有哪一个方法能够用来在用户界面中显示一致的日期信息.

5.3.3 日期/时间组件方法

其他的Date类别的方法(如下表所示),都是直接取得和设置日期值中的特定的部分的方法.

需要注意的是,UTC日期指的是在没有时区偏差的情况下(将日期转换为GMT时间)的日期值.

方法 说明
getTime() 返回表示日期的毫秒数;与valueOf()方法返回的值相同
setTime(毫秒) 以毫秒数设置日期,会改变整个日期
getFullYear() 取得4位数的年份
getUTCFullYear() 返回UTC日期的4位数年份
setFullYear(年) 设置日期的年份.传入的年份值必须是4位数字
setUTCFullYear(年) 设置UTC日期的年份.传入的年份值必须是4位数字
getMonth() 返回日期中的月份,其中0表示1月,11表示十二月
getUTCMonth() 返回UTC日期中的月份,其中0表示1月,11表示十二月
setMonth(月) 设置日期中的月份,传入的值必须大于0,超过11则增加年份
setUTCMonth(月) 设置UTC日期中的月份,传入的值必须大于0,超过11则增加年份
getDate() 返回日期月份中的天数(1~31)
getUTCDate() 返回UTC日期月份中的天数(1~31)
setDate(日) 设置日期月份中的天数.如果传入的值超过了该月中就应有的天数,则增加月份
setUTCDate(日) 设置UTC日期月份中的天数.如果传入的值超过了该月中就应有的天数,则增加月份
getDay() 返回日期中星期的星期几(其中0表示星期在日,6表示星期六)
getUTCDay() 返回UTC日期中星期的星期几(其中0表示星期在日,6表示星期六)
getHours() 返回日期中的小时数(0到23)
getUTCHours() 返回UTC日期中的小时数(0到23)
setHours(时) 设置日期中的小时数.传入值超过了23则增加月份中的天数
setUTCHours(时) 设置UTC日期中的小时数.传入值超过了23则增加月份中的天数
getMinutes() 返回日期中的分钟数(0到59)
getUTCMinutes() 返回UTC日期中的分钟数(0到59)
setMinutes(分) 设置日期中的分钟数.传入的值超过59则增加小时数
setUTCMinutes(分) 设置UTC日期中的分钟数.传入的值超过59则增加小时数
getSeconds() 返回日期中的秒数(0到59)
getUTCSeconds() 返回UTC日期中的秒数(0到59)
setSeconds(秒) 设置日期中的秒数(0到59)
setUTCSeconds(秒) 设置UTC日期中的秒数(0到59)
getMilliseconds() 返回日期中的毫秒数
getUTCMilliseconds() 返回UTC日期中的毫秒数
setMilliseconds(毫秒) 设置日期中的毫秒数
setUTCMilliseconds(毫秒) 设置UTC日期中的毫秒数
getTimezoneOffset() 返回本地时间与UTC时间相差的分钟数.例如,美国东部标准时间返回300.在某地进入夏令时的情况下,这个值会有所变化
posted @ 2015-11-20 15:58  sunshinegirl_7  阅读(291)  评论(0编辑  收藏  举报