ECMAScript 中的Date 類型是在早期Java 中的java.util.Date 類基礎上構建的。爲此,Date類型使用自UTC(Coordinated Universal Time,國際協調時間)1970 年1 月1 日午夜(零時)開始通過的毫秒數來保存日期。在使用這種數據存儲格式的條件下,Date 類型保存的日期可以精確到1970 年1月1 日以前或以後的285 616 年。
要建立一個日期對象,使用new 操做符和Date 構造函數便可,以下所示。
var now = new Date();java
在調用Date 構造函數而不傳遞參數的狀況下,新建立的對象自動得到當前日期和時間。若是想根據特定的日期和時間建立日期對象,必須傳入表示該日期的毫秒數(即從UTC 時間1970 年1 月1 日午夜起至該日期止通過的毫秒數)。爲了簡化這一計算過程,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)。只有兼容ECMAScript 5 的實現支持這種格式。
例如,要爲2004 年5 月25 日建立一個日期對象,可使用下面的代碼:
var someDate = new Date(Date.parse("May 25, 2004"));函數
若是傳入Date.parse()方法的字符串不能表示日期,那麼它會返回NaN。實際上,若是直接將表示日期的字符串傳遞給Date 構造函數,也會在後臺調用Date.parse()。換句話說,下面的代碼與前面的例子是等價的:
var someDate = new Date("May 25, 2004");
這行代碼將會獲得與前面相同的日期對象。調試
注:日期對象及其在不一樣瀏覽器中的實現有許多奇怪的行爲。其中有一種傾向是將超出範圍的值替換成當前的值,以便生成輸出。例如,在解析"January 32, 2007"時,有的瀏覽器會將其解釋爲"February 1, 2007"。而Opera 則傾向於插入當前月份的當前日期,返回"January 當前日期,2007"。也就是說,若是在2007 年9 月21 日運行前面的代碼,將會獲得"January 21, 2007"(都是21 日)。對象
Date.UTC()方法一樣也返回表示日期的毫秒數,但它與Date.parse()在構建值時使用不一樣的信息。Date.UTC()的參數分別是年份、基於0 的月份(一月是0,二月是1,以此類推)、月中的哪一天(1 到31)、小時數(0 到23)、分鐘、秒以及毫秒數。在這些參數中,只有前兩個參數(年和月)是必需的。若是沒有提供月中的天數,則假設天數爲1;若是省略其餘參數,則通通假設爲0。如下是兩個使用Date.UTC()方法的例子:
// GMT 時間2000 年1 月1 日午夜零時
var y2k = new Date(Date.UTC(2000, 0));
// GMT 時間2005 年5 月5 日下午5:55:55
var allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55));blog
這個例子建立了兩個日期對象。第一個對象表示GMT 時間2000 年1 月1 日午夜零時,傳入的值一個是表示年份的2000,一個是表示月份的0(即一月份)。由於其餘參數是自動填充的(即月中的天數爲1,其餘全部參數均爲0),因此結果就是該月第一天的午夜零時。第二個對象表示GMT 時間2005年5 月5 日下午5:55:55,即便日期和時間中只包含5,也須要傳入不同的參數:月份必須是4(由於月份是基於0 的)、小時必須設置爲17(由於小時以0 到23 表示),剩下的參數就很直觀了。
如同模仿Date.parse()同樣,Date 構造函數也會模仿Date.UTC(),但有一點明顯不一樣:日期和時間都基於本地時區而非GMT 來建立。不過,Date 構造函數接收的參數仍然與Date.UTC()相同。繼承
所以,若是第一個參數是數值,Date 構造函數就會假設該值是日期中的年份,而第二個參數是月份,以此類推。據此,能夠將前面的例子重寫以下。
// 本地時間2000 年1 月1 日午夜零時
var y2k = new Date(2000, 0);
// 本地時間2005 年5 月5 日下午5:55:55
var allFives = new Date(2005, 4, 5, 17, 55, 55);ip
這個例子建立了兩個日期對象。第一個對象表示GMT 時間2000 年1 月1 日午夜零時,傳入的值一個是表示年份的2000,一個是表示月份的0(即一月份)。由於其餘參數是自動填充的(即月中的天數爲1,其餘全部參數均爲0),因此結果就是該月第一天的午夜零時。第二個對象表示GMT 時間2005年5 月5 日下午5:55:55,即便日期和時間中只包含5,也須要傳入不同的參數:月份必須是4(由於月份是基於0 的)、小時必須設置爲17(由於小時以0 到23 表示),剩下的參數就很直觀了。
如同模仿Date.parse()同樣,Date 構造函數也會模仿Date.UTC(),但有一點明顯不一樣:日期和時間都基於本地時區而非GMT 來建立。不過,Date 構造函數接收的參數仍然與Date.UTC()相同。ci
所以,若是第一個參數是數值,Date 構造函數就會假設該值是日期中的年份,而第二個參數是月份,以此類推。據此,能夠將前面的例子重寫以下。
// 本地時間2000 年1 月1 日午夜零時
var y2k = new Date(2000, 0);
// 本地時間2005 年5 月5 日下午5:55:55
var allFives = new Date(2005, 4, 5, 17, 55, 55);字符串
以上代碼建立了與前面例子中相同的兩個日期對象,只不過此次的日期都是基於系統設置的本地時區建立的。
ECMAScript 5 添加了Data.now()方法,返回表示調用這個方法時的日期和時間的毫秒數。這個方法簡化了使用Data 對象分析代碼的工做。例如:
//取得開始時間
var start = Date.now();
//調用函數
doSomething();
//取得中止時間
var stop = Date.now(),
result = stop – start;
支持Data.now()方法的瀏覽器包括IE9+、Firefox 3+、Safari 3+、Opera 10.5 和Chrome。在不支持它的瀏覽器中,使用+操做符把Data 對象轉換成字符串,也能夠達到一樣的目的。
//取得開始時間
var start = +new Date();
//調用函數
doSomething();
//取得中止時間
var stop = +new Date(),
result = stop - start;
繼承的方法
與其餘引用類型同樣,Date 類型也重寫了toLocaleString()、toString()和valueOf()方法;但這些方法返回的值與其餘類型中的方法不一樣。Date 類型的toLocaleString()方法會按照與瀏覽器設置的地區相適應的格式返回日期和時間。這大體意味着時間格式中會包含AM 或PM,但不會包含時區信息(固然,具體的格式會因瀏覽器而異)。而toString()方法則一般返回帶有時區信息的日期和時間,其中時間通常以軍用時間(即小時的範圍是0 到23)表示。下面給出了在不一樣瀏覽器中調用toLocaleString()和toString()方法,輸出PST(Pacific Standard Time,太平洋標準時間)時間2007年2 月1 日午夜零時的結果。
Internet Explorer 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
顯然, 這兩個方法在不一樣的瀏覽器中返回的日期和時間格式可謂截然不同。事實上,toLocaleString()和toString()的這一差異僅在調試代碼時比較有用,而在顯示日期和時間時沒有什麼價值。
至於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
注:從邏輯上講,2007 年1 月1 日要早於2007 年2 月1 日,此時若是咱們說前者小於後者比較符合常理。而表示2007 年1 月1 日的毫秒值小於表示2007 年2 月1 日的毫秒值,所以在首先使用小於操做符比較日期時,返回的結果是true。這樣,就爲咱們比較日期提供了極大方便。
日期格式化方法
Date 類型還有一些專門用於將日期格式化爲字符串的方法,這些方法以下。
toDateString()——以特定於實現的格式顯示星期幾、月、日和年;
toTimeString()——以特定於實現的格式顯示時、分、秒和時區;
toLocaleDateString()——以特定於地區的格式顯示星期幾、月、日和年;
toLocaleTimeString()——以特定於實現的格式顯示時、分、秒;
toUTCString()——以特定於實現的格式完整的UTC 日期。
與toLocaleString()和toString()方法同樣,以上這些字符串格式方法的輸出也是因瀏覽器而異的,所以沒有哪個方法可以用來在用戶界面中顯示一致的日期信息。
注:除了前面介紹的方法以外,還有一個名叫toGMTString()的方法,這是一個與toUTCString()等價的方法,其存在目的在於確保向後兼容。不過,ECMAScript 推薦如今編寫的代碼一概使用toUTCString()方法。
日期/時間組件方法
到目前爲止,剩下還未介紹的Date 類型的方法(以下表所示),都是直接取得和設置日期值中特定部分的方法了。須要注意的是,UTC 日期指的是在沒有時區誤差的狀況下(將日期轉換爲GMT 時間)的日期值。