天天看點

ECMAScript中的Date類型簡介

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();

DateTypeExample01.htm

在調用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"));

DateTypeExample01.htm

如果傳入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));

DateTypeUTCExample01.htm

這個例子建立了兩個日期對象。第一個對象表示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);

DateTypeConstructorExample01.htm

以上代碼建立了與前面例子中相同的兩個日期對象,隻不過這次的日期都是基于系統設定的本地時區建立的。

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;

5.3.1 繼承的方法

與其他引用類型一樣,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

DateTypeValueOfExample01.htm

從邏輯上講,2007年1月1日要早于2007年2月1日,此時如果我們說前者小于後者比較符合常理。而表示2007年1月1日的毫秒值小于表示2007年2月1日的毫秒值,是以在首先使用小于操作符比較日期時,傳回的結果是true。這樣,就為我們比較日期提供了極大友善。

5.3.2 日期格式化方法

Date類型還有一些專門用于将日期格式化為字元串的方法,這些方法如下。

toDateString()——以特定于實作的格式顯示星期幾、月、日和年;

toTimeString()——以特定于實作的格式顯示時、分、秒和時區;

toLocaleDateString()——以特定于地區的格式顯示星期幾、月、日和年;

toLocaleTimeString()——以特定于實作的格式顯示時、分、秒;

toUTCString()——以特定于實作的格式完整的UTC日期。

與toLocaleString()和toString()方法一樣,以上這些字元串格式方法的輸出也是因浏覽器而異的,是以沒有哪一個方法能夠用來在使用者界面中顯示一緻的日期資訊。

除了前面介紹的方法之外,還有一個名叫toGMTString()的方法,這是一個與toUTCString()等價的方法,其存在目的在于確定向後相容。不過,ECMAScript推薦現在編寫的代碼一律使用toUTCString()方法。

5.3.3 日期/時間元件方法

到目前為止,剩下還未介紹的Date類型的方法(如下表所示),都是直接取得和設定日期值中特定部分的方法了。需要注意的是,UTC日期指的是在沒有時區偏差的情況下(将日期轉換為GMT時間)的日期值。

方  法說  明getTime()傳回表示日期的毫秒數;與valueOf()方法傳回的值相同setTime(毫秒)以毫秒數設定日期,會改變整個日期getFullYear()取得4位數的年份(如2007而非僅07)getUTCFullYear()傳回UTC日期的4位數年份setFullYear(年)設定日期的年份。傳入的年份值必須是4位數字(如2007而非僅07)setUTCFullYear(年)設定UTC日期的年份。傳入的年份值必須是4位數字(如2007而非僅07)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(分)設定UTC日期中的分鐘數。傳入的值超過59則增加小時數getSeconds()傳回日期中的秒數(0到59)getUTCSeconds()傳回UTC日期中的秒數(0到59)setSeconds(秒)設定日期中的秒數。

傳入的值超過了59會增加分鐘數setUTCSeconds(秒)設定UTC日期中的秒數。傳入的值超過了59會增加分鐘數getMilliseconds()傳回日期中的毫秒數getUTCMilliseconds()傳回UTC日期中的毫秒數setMilliseconds(毫秒)設定日期中的毫秒數setUTCMilliseconds(毫秒)設定UTC日期中的毫秒數getTimezoneOffset()傳回本地時間與UTC時間相差的分鐘數。例如,美國東部标準時間傳回300。在某地進入夏令時的情況下,這個值會有所變化

想要了解更多Java基礎知識,可以點選評論區連結和小編一起學習java吧,此視訊教程為初學者而著,零基礎入門篇!給同學們帶來全新的Java300集課程啦!java零基礎小白自學Java必備優質教程_手把手圖解學習Java,讓學習成為一種享受_哔哩哔哩_bilibili

繼續閱讀