javascript中的內置對象是我們經常會用到的,那麼今天我們就來說說Date的四種構造方法吧 一、new Date() 這是我們最常使用也最熟悉不過的Date對象的構造方法了,通過無參數的構造函數我們可以預設獲取到一個代表實例化時的Date對象 二、new Date(value) 這個構造方法的 ...
javascript中的內置對象是我們經常會用到的,那麼今天我們就來說說Date的四種構造方法吧
一、new Date()
這是我們最常使用也最熟悉不過的Date對象的構造方法了,通過無參數的構造函數我們可以預設獲取到一個代表實例化時的Date對象
var now = new Date(); console.log(now) //Thu Sep 19 2019 16:13:08 GMT+0800 (中國標準時間)
二、new Date(value)
這個構造方法的參數是一個Number型,表示自1970年1月1日00:00:00 UTC(the Unix epoch)以來的毫秒數,忽略了閏秒。這個方法中可以用整型,也可以用浮點型,不過浮點型後面的小數點後的尾數一般會被忽略就是了。雖然在node環境(v10.15.3)下參數的確是從00:00:00時分開始計數,但是,通過實測發現在部分瀏覽器環境(在Edge,Chrome下如此)下參數是卻從08:00:00開始計數,如下代碼所示:
//瀏覽器 var time1 = new Date(1000); var time2 = new Date(2000.2); var time3 = new Date(2000.8); console.log(time1); //Thu Jan 01 1970 08:00:01 GMT+0800 (中國標準時間) console.log(time2); //Thu Jan 01 1970 08:00:02 GMT+0800 (中國標準時間) console.log(time3.getMilliseconds()); //0 //node var time4 = new Date(1000); console.log(time4); //1970-01-01T00:00:00.001Z
原因分析:node中是嚴格遵守UTC時間標準的,所以是嚴格的1970年1月1日00:00:00 UTC(the Unix epoch);而在瀏覽器中一般是以本地時間為準,例如:在中國是以北京時間為基準的,而北京在東八區,所以會比標準的格林尼治時間要多8個小時,將電腦時區設置成太平洋時區後測試
//改成太平洋時間後 var time5 = new Date(1000); console.log(time5); //Wed Dec 31 1969 16:00:01 GMT-0800 (Pacific Standard Time)
看到太平洋時間發現時間被“減了”,就會想到參數為負數的時候,是不是也會從這個基準時間開始減,如下:
//北京時間下 var time6 = new Date(-1000); console.log(time6); //Thu Jan 01 1970 07:59:59 GMT+0800 (China Standard Time)
三、new Date(dateString)
這個構造函數應該是最有用和最會出現一些問題的了。參數dateString,顧名思義,是一個String型的格式化date字元串。該字元串應該能被Date.parse()方法正確識別,即符合IETF-compliant RFC 2822 timestamps或version of IOS8601。那這個構造函數到底能解析哪些格式化字元串?又不能解析哪些字元串呢?
註:因為該構造函數在不同瀏覽器以及不同node版本之間有差異,故不推薦大家使用,同理也不推薦使用Date.parse,大家可以使用自己定義的工具函數把字元串轉成date哦!
var time1 = new Date('2019/9/9'); var time2 = new Date('2019/09/09'); var time3 = new Date('2019-9-9'); var time4 = new Date('2019-09-09'); var time5 = new Date('2019 9 9'); var time6 = new Date('2019/9/9 12:20:05'); var time7 = new Date('2019-9-9 12:70:100'); var time8 = new Date('2019 9 9 14 0 1'); var time9 = new Date('2019/09/09 -12:20:13'); var time10 =new Date("February 3,2009 12:30:15"); console.log(time1); //Mon Sep 09 2019 00:00:00 GMT+0800 (中國標準時間) console.log(time2); //Mon Sep 09 2019 00:00:00 GMT+0800 (中國標準時間) console.log(time3); //Mon Sep 09 2019 00:00:00 GMT+0800 (中國標準時間) console.log(time4); //Mon Sep 09 2019 08:00:00 GMT+0800 (中國標準時間) console.log(time5); //Mon Sep 09 2019 00:00:00 GMT+0800 (中國標準時間) console.log(time6); //Mon Sep 09 2019 12:20:05 GMT+0800 (中國標準時間) console.log(time7); //Invalid Date console.log(time8); //Invalid Date console.log(time9); //Invalid Date console.log(time10); Tue Feb 03 2009 12:30:15 GMT+0800 (中國標準時間)
一般情況下,建議使用yyyy/MM/dd hh:mm:ss格式,其他格式可能會出現意想不到的錯誤
四、new Date(year,monthIndex[,day[,hours[,minutes[,seconds[,milliseconds]]]]]
這個構造通過多個函數,指定年月日時分秒來構造日期對象。此方法參數至少為兩個,表示年月,可選參數5個,因為參數只有1個的話,是number型會使用第二種構造方法,是string型會使用第三種構造方法。此方法的參數類型可以是整數,浮點數(浮點會被轉化為整型),或是字元串(字元串會被轉化為Number型),也可以是正數、負數(但是,註意不能超過日期所能表示的最大範圍 -100,000,000 天至 100,000,000 天)。當參數只有2個的時候,除了day預設為1,其餘參數預設為0(此時不受時區的影響)。另外,參數2的月份需要加1,因為它對應的是0-11(同getMonth()和setMonth())
var time1 = new Date(2019,2); var time2 = new Date(2019.3,'5'); var time3 = new Date(2019,4,-3); var time4 = new Date(2019,5,10,13,70,100,50); console.log(time1); //Fri Mar 01 2019 00:00:00 GMT+0800 (中國標準時間) console.log(time2); //Sat Jun 01 2019 00:00:00 GMT+0800 (中國標準時間) console.log(time3); //Sat Apr 27 2019 00:00:00 GMT+0800 (中國標準時間) console.log(time4); //Mon Jun 10 2019 14:11:40 GMT+0800 (中國標準時間)
同之前的原因,在node環境下,時間會出現偏移,在原有”標準時間“下要減去時區的時間差,例如,北京時間為東八區,在瀏覽器中基本保持與傳參一致,但是在node環境下會”減去”這八小時的時間差,相反,西八區會加上這八小時的時間差。
最後,再說一點,就是Date對象作為參數構造Date在某些情況下也是可以的,這個時候,參數先被解析成字元串,然後通過第二種構造方法執行