JavaScript - 時間對象 Date

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。在某地進入夏令時的情況下,這個值會有所變化
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容