處理時間是常見的需求,總結下Date類的相關知識 構建時間對象 "Date" 對象基於1970年1月1日(世界標準時間)起的毫秒數。 構建對象實例有多種方式: 1. 不傳入參數,預設以系統當前時間返回一個時間對象. 返回的是一個 對象實例 ,控制台列印了時間字元串,是預設調用了 方法。 2. 傳入 ...
處理時間是常見的需求,總結下Date類的相關知識
構建時間對象
Date 對象基於1970年1月1日(世界標準時間)起的毫秒數。
構建對象實例有多種方式:
- 不傳入參數,預設以系統當前時間返回一個時間對象.
new Date();
new Date();
// Wed Mar 13 2019 10:49:28 GMT+0800 (中國標準時間)
返回的是一個對象實例,控制台列印了時間字元串,是預設調用了toString()
方法。
- 傳入 自1970年1月1日00:00:00 (世界標準時間) 起經過的毫秒數.
new Date(value);
new Date(1323532800000);
// Sun Dec 11 2011 00:00:00 GMT+0800 (中國標準時間)
// 可以傳入負數,代表1970年1月1日00:00:00之前的時間
new Date(-10000);
// Thu Jan 01 1970 07:59:50 GMT+0800 (中國標準時間)
- 傳入 表示日期的字元串.
new Date(dateString);
new Date('2011-11-11')
new Date('2011/11/11')
new Date('11/11/2011')
// Fri Nov 11 2011 00:00:00 GMT+0800 (中國標準時間)
new Date('Sun Dec 11 2011 00:00:00')
// Sun Dec 11 2011 00:00:00 GMT+0800 (中國標準時間) 註意這裡是12月份了,11代表的12月
new Date('2011-11-11 11:11:11')
new Date('2011-11-11T11:11:11')
// Fri Nov 11 2011 11:11:11 GMT+0800 (中國標準時間)
new Date('aa')
// Invalid Date
只要能被[Date.parse()](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/parse)
解析的字元串,都可以作為參數傳入。
- 傳入 年月日等多個整數參數.
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);
new Date(2011,11,11,11,11,11,111)
// Sun Dec 11 2011 11:11:11 GMT+0800 (中國標準時間)
new Date(2011,11)
// Thu Dec 01 2011 00:00:00 GMT+0800 (中國標準時間)
new Date(2011)
// Thu Jan 01 1970 08:00:02 GMT+0800 (中國標準時間) 只傳入一個整數參數,會被當做毫秒數解析
new Date('2011',11,11)
//Sun Dec 11 2011 00:00:00 GMT+0800 (中國標準時間) 傳入的參數會進行轉換
new Date('2011.11',11,11)
//Sun Dec 11 2011 00:00:00 GMT+0800 (中國標準時間)
new Date('a',11,11)
// Invalid Date 無法轉換成數字的參數
這種方式至少需要傳入兩個整數參數標誌年、月,只傳入一個參數會當做毫秒數進行構建;傳入的參數會自動轉換成數字,所以例子中傳入數字字元串也是可以創建成功的。
如果把Date()
直接當作函數調用,不過有沒有傳入參數,都會返回當前時間的時間字元串
Date()
// "Wed Mar 13 2019 20:22:42 GMT+0800 (中國標準時間)"
Date(2011,11)
// "Wed Mar 13 2019 20:22:47 GMT+0800 (中國標準時間)"
自動折算
時間的參數都是有範圍的:
- 年 使用四位數年份,比如2000。如果寫成兩位數或個位數,則加上1900,即10代表1910年。如果是負數,表示公元前
- 月份的範圍是0~11 (0是一月份,11是12月份)
- 天數的範圍是1~31
- 小時的範圍是0~23
- 分鐘的範圍是0~59
- 秒數的範圍是0~59
- 毫秒的範圍是0~999
如果創建時間對象的時候,傳入的參數超出了實際範圍會怎樣呢?
new Date(2010,12,11)
// Tue Jan 11 2011 00:00:00 GMT+0800 (中國標準時間) 月的參數12超出了範圍,年份多了一年,然後月份變成了1月份(對應參數0)
new Date(2010,11,0)
// Tue Nov 30 2010 00:00:00 GMT+0800 (中國標準時間) 天的參數0不在範圍內,所以月份變成了11(對應參數10),然後天變成了30
new Date(2010,11,11,25)
// Sun Dec 12 2010 01:00:00 GMT+0800 (中國標準時間) 小時的參數25超出了範圍,天數變成了12,然後小時變成了1
當傳入的參數超出了實際範圍,會自動折算成合理的範圍 , 相鄰的數值也會進行調整。
利用這個特性可以做很多的事情,比如,你想獲取2012年2月有共有多少天,可以這樣處理。
new Date(2012,2,0).getDate()
// 29 -- 三月(對應2)沒有0天,所以折算到二月(對應1)的最後一天,這時取得getDate()即是該月的天數
類型轉換
如果+
或者 ==
運算符其中一個操作數是對象時,需要先把對象轉化成原始值。其他的對象都會先調用valueOf()
方法,而時間對象類型會先調用toString()
1 + new Date()
// "1Thu Mar 14 2019 13:51:46 GMT+0800 (中國標準時間)"
new Date(2011,11,11).getTime() == new Date(2011,11,11)
// false 後面的Date對象,調用了toString()
new Date(2011,11,11).getTime() == +new Date(2011,11,11)
// true 此時隱式轉換期待轉換為數字,調用了valueOf()
其他期待轉換為數字的場景,也是正常先調用valueOf()
的
時間戳
時間對象在傳遞過程中,一般會轉換為時間戳,有多種實現方式
new Date(2011,11,11).valueOf()
// 1323532800000
new Date(2011,11,11).getTime()
// 1323532800000
+new Date(2011,11,11)
// 1323532800000
Date.now()
// 1552543813256 當前時間距離時間零點(1970年1月1日 00:00:00 UTC)的毫秒數
註意以上都是毫秒,如果要轉成UNIX時間戳(從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數),可以用以下方法
Math.round(ms/1000)
原生方法
Date對象提供了多種方法來獲取/設置時間數據
- Date對象提供了一系列get*方法,用來獲取實例對象某個方面的值。
- getTime():返回實例距離1970年1月1日00:00:00的毫秒數,等同於valueOf方法。
- getDate():返回實例對象對應每個月的幾號(從1開始)。
- getDay():返回星期幾,星期日為0,星期一為1,以此類推。
- getFullYear():返回四位的年份。
- getMonth():返回月份(0表示1月,11表示12月)。
- getHours():返回小時(0-23)。
- getMilliseconds():返回毫秒(0-999)。
- getMinutes():返回分鐘(0-59)。
- getSeconds():返回秒(0-59)。
- getTimezoneOffset():返回當前時間與 UTC 的時區差異,以分鐘錶示,返回結果考慮到了夏令時因素。
還提供了這些方法對應的 UTC 版本,用來返回 UTC 時間。
- getUTCDate()
- getUTCFullYear()
- getUTCMonth()
- getUTCDay()
- getUTCHours()
- getUTCMinutes()
- getUTCSeconds()
- getUTCMilliseconds()
new Date(2011,11,11,11,11,11,111).getHours()
// 11
new Date(2011,11,11,11,11,11,111).getUTCHours()
// 3 可見UTC時間比北京時間晚8個小時,也就是下麵的時區差異 -480分鐘
new Date(2011,11,11,11,11,11,111).getTimezoneOffset()
// -480
- Date對象提供了一系列set*方法,用來設置實例對象的各個方面。
- setDate(date):設置實例對象對應的每個月的幾號(1-31),返回改變後毫秒時間戳。
- setFullYear(year [, month, date]):設置四位年份。
- setHours(hour [, min, sec, ms]):設置小時(0-23)。
- setMilliseconds():設置毫秒(0-999)。
- setMinutes(min [, sec, ms]):設置分鐘(0-59)。
- setMonth(month [, date]):設置月份(0-11)。
- setSeconds(sec [, ms]):設置秒(0-59)。
- setTime(milliseconds):設置毫秒時間戳。
這些方法基本是跟get方法一一對應的,但是沒有setDay方法,因為星期幾是計算出來的,而不是設置的。
set系列方法除了setTime(),都有對應的 UTC 版本,即設置 UTC 時區的時間。
- setUTCDate()
- setUTCFullYear()
- setUTCHours()
- setUTCMilliseconds()
- setUTCMinutes()
- setUTCMonth()
- setUTCSeconds()
設置時間的方法,配合自動折算,可以很便捷的得到相對時間
let now = new Date();
// 99天之後的時間
now.setDate(now.getDate() + 99)
// 10小時之前
now.setHours(now.getHours() - 10)
- date對象提供一系列to* ,用來將時間對象轉換為字元串
- toString() 返回一個完整的日期字元串。
- toDateString() 返回年月日的字元串
- toTimeString() 返回時間字元串,不包含年月日
也有對應的 UTC 版本 和 local版本
- toUTCString() 返回對應的 UTC 時間,也就是比北京時間晚8個小時。
- toLocaleString() 返回完整的本地時間。
let now = new Date()
undefined
now.toString()
// "Thu Mar 14 2019 14:32:18 GMT+0800 (中國標準時間)"
now.toUTCString()
// "Thu, 14 Mar 2019 06:32:18 GMT" UTC時間比北京時間晚8個小時
now.toLocaleString()
// "2019/3/14 下午2:32:18"