Date 類型提供了有關日期和時間的信息,包括當前日期和時間以及相關的計算功能。
創建日期對象:
var now = new Date();
構造函數不傳參數情況下,新對象自動獲得當前日期和時間。
如果想要更具特定的日期和時間創建日期對象,必須傳入表示該日期的毫秒數(即從UTC時間1970年1月1日午夜起至該日期止經過的毫秒數)。
為了簡化這一計算過程,ECMAScript 提供了兩個方法:
-
Date.parse():該方法接受一個表示日期的字符串參數,然后嘗試根據這個字符串返回相應日期的毫秒數。
ECMA-262沒有定義 Date.parse() 應該支持那種日期格式,因此這個方法的行為因實現而異,而且通常是因地區而異。
"月/日/年",如 "6/13/2004"。
"因為月名 日,年",如 "January 12,2004"。
"因為星期幾 因為月名 日 年 時:分:秒 時區",如 "TueMay 25 2004 00:00:00 GMT-0770"。
-
ISO 8601擴展格式YYYY-MM-DDTHH:mmSS.SSZ (例如:"2004-05-25T00:00:00")。只有兼容ECMAScript 5的實現支持這種格式。
在一次項目的擴展中,使用 YYYY-MM-DDTHH:mmSS.SSZ 這個格式在 Safari 上就出現無法解析的問題,解決方式是把 '-' 轉 成 '/'。
// 創建 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.UTC()方法同樣也返回表示日期的毫秒數,但它與 Date.parse() 在構建值時使用不同的信息。
- 參數一:年份、基于0的月份(一月是0,二月是1,以此類推)
- 參數二:月中的哪一天(1到31)
- 參數三:小時數(0到23)
- 參數四:分鐘
- 參數五:秒
- 參數六:毫秒數
在這些參數中只有前兩個參數(年和月)是必需的。
// 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));
// 本地時間2000年1月1日午夜零時
var y2k_1 = new Date(2000, 0);
// 本地時間2005年5月5日下午5:55:55
var allFives_1 = new Date(2005, 4, 5, 17, 55, 55);
ECMAScript 5 添加了 Date.now() 方法,返回表示調用這個方法時的日期和時間的毫秒數。這個方法簡化了使用Date對象分析代碼的工作。
// 取得開始時間
var start = Date.now();
// 調用函數
doSomething()
// 取得停止時間
var stop = Date.now(),
result = stop - start;
獲取一個方法的執行時間毫秒值
支持 Date.now() 方法的瀏覽器包括 IE9+、Firefox 3+、Safari 3+、Opera 10.5和Chrome。
// 取得開始時間
var start = +new Date();
// 調用函數
doSomething()
// 取得停止時間
var stop = +new Date();
result = stop - start;
在不支持 Date.now() 方法的瀏覽器中,使用 '+' 操作符把Data對象轉換成字符串,也可以得到毫秒值。
比較 Date 的大小
Date 類型的 ValueOf() 方法,不返回字符串,而是返回日期的毫秒表示。因此,可以方便使用比較操作符(大于或小于)來比較日期值。
var date1 = new Date(2007, 0, 1);
var date2 = new Date(2007, 1, 1);
alert(date1 < date2) // true
alert(date1 > date2) // false
日期格式化
Date 類型還有一些專門用于將日期格式化為字符串的方法:
- toDateString():
new Date().toDateString() // "Tue Oct 18 2016"
- toTimeString():
new Date().toTimeString() // "23:29:12 GMT+0800 (CST)"
- toLocaleDateString():
new Date().toLocaleDateString() // "2016/10/18"
- toLocaleTimeString():
new Date().toLocaleTimeString() // "下午11:30:28"
- toUTCString():
new Date().toUTCString() // "Tue, 18 Oct 2016 15:30:53 GMT"
日期/時間組件方法
方法 | 說明 |
---|---|
getTime() | 返回表示日期的毫秒數:與valueOf()方法返回的值相同 |
setTime(毫秒) | 以毫秒數設置日期,會改變整個日期 |
getFullYear() | 獲取四位數的年豐(如 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) |
settMinutes(分) | 設置日期中的分鐘數。傳入的值超過59則增加小時數 |
settUTCMinutes(分) | 設置UTC日期中的分鐘數。傳入的值超過59則增加小時數 |
getSeconds() | 返回日期中的秒數(0到59) |
getUTCSeconds() | 返回UTC日期中的秒數(0到59) |
setSeconds(秒) | 設置日期中的秒數,傳入的值超過59則增加分鐘數 |
setUTCSeconds(秒) | 設置UTC日期中的秒數,傳入的值超過59則增加分鐘數 |
getMillSeconds() | 返回日期中的毫秒數 |
getUTCMillSeconds() | 返回UTC日期中的毫秒數 |
settMillSeconds() | 設置日期中的毫秒數 |
settUTCMillSeconds() | 設置UTC日期中的毫秒數 |
getTimezoneOffset() | 返回本地時間與UTC時間相差的分鐘數。例如:美國東部標準時間返回300。在某地進入夏令時的情況下,這個值會有所變化 |