JS基础知识回顾:引用类型(二)

ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的。

因此,Date类型使用自UTC(Coordinated Universal Time,国际协调时间)1970年1月1日午夜零点开始经过的毫秒数来保存日期。

在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日或之后的285616年。

要创建一个日期对象,使用new操作符和Date构造函数即可:var now=new Date();

 

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

如果想根据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数。

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

 

Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。

ECMA-262没有定义Date.parse()应该支持哪种日期格式,因此这个方法的行为因实现而异,而且通常是因地区而异。

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

“月/日/年”,如6/13/2004

“英文月明 日,年”,如January 12,2004

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

ISO 8601 扩展格式 YYYY-MM-DDTHH:mm:ss.sssZ,如:2004-05-25T00:00:00(只有兼容ECMAScript5的实现支持这种格式)

如果传入Date.parse()方法的字符串不能表示日期,那么它会返回NaN。

实际上,如果直接将表示日期的字符串传递给Date构造函数,也会在后台调用Date.parse(),例如:var someDate=new Date("May 25,2004");

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

例如,在解析"January 32,2007"时,有的浏览器会将其解释为"February 1,2007";而Opera则更倾向于插入当前月份的当前日期,返回"January 当前日期,2007"。

 

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

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

在这些参数中,只有前两个参数是必须的,如果没有提供月中的天数,则假设天数为1,如果省略其他参数,则统统假设为0。

var y2k=new Date(Date.UTC(2000,0));//GMT时间2000年1月1日午夜零时

var allFives=new Date(Date.UTC(2005,4,5,17,55,55));//GMT时间2005年5月5日下午5:55:55

如同模仿Date.parse()一样,Date构造函数也会模仿Date.UTC(),但有一点明显不同:日期和时间都是基于本地时区而非GMT来创建。

不过Date构造函数接收的参数仍然与Date.UTC()相同。

var y2k=new Date(2000,0);//本地时间2000年1月1日午夜零时

var allFives=new Date(2005,4,5,17,55,55);//本地时间2005年5月5日下午5:55:55

 

ECMAScript5中增加了Date.now()方法,返回表示调用这个方法时的日期和时间的毫秒数,这个方法简化了使用Date对象分析代码的工作。

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

doSomething();//调用函数

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

不过支持这个方法的浏览器只有IE9+、Firefox3+、Safari3+、Opera10.5、Chrome。

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

var start=+new Date();//获得开始时间

doSomething();//调用函数

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

 

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

Date类型的toLocaleString()方法会按照与浏览器设置的地区相适应的格式返回日期和时间,这大致意味着时间格式中会包含AM或者PM,但不会包含时区信息。

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

以下列出在不同浏览器中调用toLocaleString()和toString()方法,输出PST(Pacific Standard Time,太平洋标准时间)2007年2月1日午夜零时的结果:

-IE 8-

toLocaleString()-Thursday,February 01,2007 12:00:00 AM

toString()-Thu Feb 1 00:00:00 PST 2007

-Firefox 3.5-

toLocaleString()-Thursday,February 01,2007 12:00:00 AM

toString()-Thu Feb 01 2007 00:00:00 GMT-0800 (Pacific Standard Time)

-Safari 4-

toLocaleString()-Thursday,February 01,2007 00:00:00

toString()-Thu Feb 01 2007 00:00:00 GMT-0800 (Pacific Standard Time)

-Chrome 4-

toLocaleString()-Thu Feb 01 2007 00:00:00 GMT-0800(Pacific Standard Time)

toString()-Thu Feb 01 2007 00:00:00 GMT-0800(Pacific Standard Time)

-Opera 10-

toLocaleString()-2/1/2007 12:00:00 AM

toString()-Thu,01 Feb 2007 00:00:00 GMT-0800

这两种方法在不同浏览器中返回的日期和时间格式可谓大相径庭,但是这一差别仅仅在调试代码是比较有用,在显示日期和时间时并没有什么价值。

Date类型的valueOf()方法并不会返回字符串,而是返回日期的毫秒表示,因此可以方便使用比较操作符来比较日期大小:

var date1=new Date(2007,0,1);//"January 1,2007"

var date2=new Date(2007,1,1);//"February 1,2007"

alert(date1<date2);//true

alert(date1>date2);//false

 

Date类型还有一些专门用于将日期格式化为字符串的方式。

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

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

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

toLocaleTimeString()-以特定于实现的格式显示时、分、秒;

toUTCString()-以特定于实现的格式完整的显示UTC日期。

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

除了前面介绍的方法之外,还有一个名叫toGMTString()的方法,这是一个与toUTCString()等价的方法,其存在的目的在于确保向后兼容,不过ECMAScript推荐现在编写的代码一律使用toUTCString()方法。

UTC日期指的是在没有时区偏差的情况下(将日期转换为GMT时间)的日期值。

 

Date类型当中还定义了一些直接取得和设置日期值中特定部分的方法。

getTime()-返回表示日期的毫秒数,与valueOf()方法返回的值相同

setTime(毫秒)-以毫秒数设置日期,会改变整个日期

getFullYear()-取得四位数的年份

getUTCFullYear()-返回UTC日期的四位数年份

setFullYear(年)-设置日期的年份,传入的年份值必须是四位数字

setUTCFullYear(年)-设置UTC日期的年份,传入的年份值必须是四位数字

getMonth()-返回日期中的月份,其中0表示一月,11表示十二月

getUTCMonth()-返回UTC日期中的月份,其中0表示一月,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(分)-设置日期中的分钟数,传入的值超过59则增加小时数

getSeconds()-返回日期中的秒数(0到59)

getUTCSeconds()-返回UTC日期中的秒数(0到59)

setSeconds(秒)-设置日期中的秒数,传入的值超过59则增加分钟数

setUTCSeconds(秒)-设置UTC日期中的秒数,传入的值超过59则增加分钟数

getMilliseconds()-返回日期中的毫秒数

getUTCMilliseconds()-返回UTC日期中的毫秒数

setMilliseconds(毫秒)-设置日期中的毫秒数

setUTCMilliseconds(毫秒)-设置UTC日期中的毫秒数

getTimezoneOffset()-返本地时间与UTC时间相差的分钟数

JS基础知识回顾:引用类型(二),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。