ECMAScript Date類型 parse()、UTC()操作方法
ECMAScript中的Date類型是在早期Java中的java.util.Date類基礎(chǔ)上杓建的。為此,Date類型使用自UTC(Coordinated Universal Time,國(guó)際協(xié)調(diào)時(shí)間)1970年1月1日午夜(零時(shí))開始經(jīng)過(guò)的毫秒數(shù)來(lái)保存日期。在使用這種數(shù)據(jù)存儲(chǔ)格式的條件下,Date類型保存的日期能夠精確到1970年1月1日之前或之后的285 616年。 要?jiǎng)?chuàng)建一個(gè)日期對(duì)象,使用new操作符和Date構(gòu)造函數(shù)即可,如下所示:
var now=new Date();
在調(diào)用Date構(gòu)造函數(shù)而不傳遞參數(shù)的情況下,新創(chuàng)建的對(duì)象自動(dòng)獲得當(dāng)前日期和時(shí)間。如果想根據(jù)特定的日期和時(shí)間創(chuàng)建日期對(duì)象,必須傳人表示該日期的毫秒數(shù)(即從UTC時(shí)間1970年1月1日午夜起至該日期止經(jīng)過(guò)的毫秒數(shù))。為了簡(jiǎn)化這一計(jì)算過(guò)程,ECMAScript提供了兩個(gè)方法:Date.parse()和Date.UTC()。
其中,Date.parse)方法接收一個(gè)表示日期的字符串參數(shù),然后嘗試根據(jù)這個(gè)字符串返回相應(yīng)日期的毫秒數(shù)。ECMA-262沒(méi)有定義Date.parse()應(yīng)該支持哪種日期格式,因此這個(gè)方法的行為因?qū)崿F(xiàn)而異,而且通常是因地區(qū)而異。將地區(qū)設(shè)置為美國(guó)的瀏覽器通常都接受下列日期格式:
◎“月/日/年”,如6/13/2004;
◎“英文月名日,年”,如January 12,2004;
◎“英文星期幾英文月名日年時(shí):分:秒時(shí)區(qū)”,如Tue May 25 2004 00:00:00 GMT-0700。
例如,要為2004年5月25日創(chuàng)建一個(gè)日期對(duì)象,可以使用下面的代碼:
var someDate=new Date (Date.parse( "May 25, 2004”));
如果傳入Date.parse()方法的字符串不能表示日期,那么它會(huì)返回NaN。實(shí)際上,如果直接將表示日期的字符串傳遞給Date構(gòu)造函數(shù),也會(huì)在后臺(tái)調(diào)用Date.parse()。換句話說(shuō),下面的代碼與前面的例子是等價(jià)的: var someDate=new Date( "May 25, 2004");
這行代碼將會(huì)得到與前面相同的日期對(duì)象。
南昌網(wǎng)站建設(shè)公司前端開發(fā)工程師提醒,Date對(duì)象及其在不同瀏覽器中的實(shí)現(xiàn)有許多奇怪的行為,其中有一種傾向是將超出范圍的值替換成當(dāng)前的值,以便生成輸出.例如,在解析"January 32,2007"時(shí)有的瀏覽器會(huì)將其解釋為"Febunary 1 ,2007".而Opera則傾向于插入當(dāng)前月份的當(dāng)前日期,返回"January 當(dāng)前日期,2007"。也就是說(shuō),如果在2007年9月21日運(yùn)行前面的代碼,將會(huì)得到“January 21,2007”(都是21日).
Date .UTC()方法同樣也返回表示日期的毫秒數(shù),但它與Date.parse()在構(gòu)建值時(shí)使用不同的信息。Date.UTC()的參數(shù)分別是年份、基于0的月份(一月是0,二月是1,以此類推)、月中的哪一天(1到31)、小時(shí)數(shù)(0到23)、分鐘、秒以及毫秒數(shù)。在這些參數(shù)中,只有前兩個(gè)參數(shù)(年和月)是必需的。如果沒(méi)有提供月中的天數(shù),則假設(shè)天數(shù)為1;如果省略其他參數(shù),則統(tǒng)統(tǒng)假設(shè)為0。以下是兩個(gè)使用Date.UTC()方法的例子:
//GMT時(shí)間2000年1月1日午夜零時(shí)
var y2k=new Date (Date.UTC (2000,O));
//GMT時(shí)間2005年5月5日下午5:55:55
var allFives=new Date (Date.UTC (2005,4, 5, 17, 55, 55));
南昌做網(wǎng)站公司提示,這個(gè)例子創(chuàng)建了兩個(gè)日期對(duì)象。第一個(gè)對(duì)象表示GMT時(shí)間2000年1月1日午夜零時(shí),傳人的值一個(gè)是表示年份的2000,一個(gè)是表示月份的O(即一月份)。因?yàn)槠渌麉?shù)是自動(dòng)填充的(即月中的天數(shù)為1,其他所有參數(shù)均為0),所以結(jié)果就是該月第一天的午夜零時(shí)。第二個(gè)對(duì)象表示GMT時(shí)間2005年5月5日下午5:55:55,即使日期和時(shí)間中只包含5,也需要傳人不一樣的參數(shù):月份必須是4(因?yàn)樵路菔腔?的)、小時(shí)必須設(shè)置為17(因?yàn)樾r(shí)以0到23表示),剩下的參數(shù)就很直觀了。
如同模仿Date.parse() -樣,Date構(gòu)造函數(shù)也會(huì)模仿Date.UTC(),但有一點(diǎn)明顯不同:日期和時(shí)間都基于本地時(shí)區(qū)而非GMT來(lái)創(chuàng)建。不過(guò),Date構(gòu)造函數(shù)接收的參數(shù)仍然與Date.UTC()相同。
因此,如果第一個(gè)參數(shù)是數(shù)值,Date構(gòu)造函數(shù)就會(huì)假設(shè)該值是日期中的年份,而第二個(gè)參數(shù)是月份,以此類推。據(jù)此,可以將前面的例子重寫如下:
//本地時(shí)間2 000年1月1日午夜零時(shí)
var y2k=new Date(2000, 0);
//本地時(shí)間2005年5月5日下午5:55:55
var allFives=new Date (2005,4, 5,17, 55, 55);
以上代碼創(chuàng)建了與前面例子中相同的兩個(gè)日期對(duì)象,只不過(guò)這次的日期都是基于系統(tǒng)設(shè)置的本地時(shí)區(qū)創(chuàng)建的。
希望本文對(duì)廣大站長(zhǎng)或從事企業(yè)網(wǎng)站建設(shè)公司的團(tuán)隊(duì)有所幫助,如對(duì)此不太理解的,可以與南昌做網(wǎng)站公司百恒網(wǎng)絡(luò)技術(shù)部聯(lián)系。我們很高興與廣大站長(zhǎng)和從事企業(yè)網(wǎng)站建設(shè)公司技術(shù)人員分享我們的技術(shù)和經(jīng)驗(yàn)。