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基础知识回顾:引用类型(二)