Date類型使用自UTC(國際協調時間)1970年1月1日零時開始經過的毫秒數來保存日期。在這種數據格式存儲條件下,Date類型保存的日期能夠精確到1970年1月1日之前或之後的285616年。
創建一個日期對象:
var date = new Date(); document.write("當前時間:"+ date);
下面是不同瀏覽器的時間格式:
Chrome當前時間:Sat Oct 15 2016 21:37:19 GMT+0800 (中國標準時間)
Firefox 當前時間:Sat Oct 15 2016 21:38:50 GMT+0800
IE11 當前時間:Sat Oct 15 2016 21:39:37 GMT+0800 (中國標準時間)
IE10- 當前時間:Sat Oct 15 21:40:33 UTC+0800 2016
Safari 當前時間:Sat Oct 15 2016 21:41:22 GMT+0800 (?D1ú±ê×?ê±??)
GMT和UTC的區別
格林尼治標準時間(GMT,舊譯“格林威治平均時間”或“格林威治標準時間”)是指位於倫敦郊區的皇傢格林尼治天文臺的標準時間,因為本初子午線被定義在通過那裡的經線。
理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時)的時間。由於地球在它的橢圓軌道裡的運動速度不均勻,這個時刻可能和實際的太陽時相差16分鐘。
地球每天的自轉是有些不規則的,而且正在緩慢減速。(10多億年前,地球的一天隻有18小時,地球自轉越來越慢,今天的一天是24小時,據科學傢估算,在遙遠的未來,地球上的一天將會是960小時!而10億年前,月球離地球更近,那時一個月才20天.目前,月球仍以每年4厘米的距離遠離地球。以前也不瞭解,以為地球每天就是24小時多一點。這裡也不過多鋪開,自己可以去瞭解)所以,格林尼治時間已經不再被作為標準時間使用。現在的標準時間——協調世界時(UTC)——由原子鐘提供。
自1924年2月5日開始,格林尼治天文臺每隔一小時會向全世界發放調時信息
======================
協調世界時(UTC)
英文:Coordinated Universal Time
法文:Temps universel coordonné
別稱:世界統一時間
世界標準時間
國際協調時間
協調世界時,又稱世界統一時間,世界標準時間,國際協調時間,簡稱UTC。它從英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”而來。
中國大陸采用ISO8601-1988的《數據元和交換格式信息交換日期和時間表示法》(GB/T 7408-1994)稱之為國際協調時間。
中國臺灣采用CNS 7648的《資料元及交換格式–資訊交換–日期及時間的表示法》(與ISO8601類似)稱之為世界統一時間。
協調世界時是以原子時秒長為基礎,在時刻上盡量接近於世界時的一種時間計量系統。
【歷史】
國際原子時的準確度為每日數納秒,而世界時的準確度為每日數毫秒。對於這種情況,一種稱為協調世界時的折衷時標於1972年面世。為確保協調世界時與世界時相差不會超過0.9秒,在有需要的情況下會在協調世界時內加上正或負
閏秒。因此協調世界時與國際原子時之間會出現若幹整數秒的差別。位於巴黎的國際地球自轉事務中央局負責決定何時加入閏秒。
【用處】
這套時間系統被應用於許多互聯網和萬維網的標準中,例如,網絡時間協議就是協調世界時在互聯網中使用的一種方式。
在軍事中,協調世界時區會使用“Z”來表示。又由於Z在無線電聯絡中使用“Zulu”作代稱,協調世界時也會被稱為"Zulu time"。
中國大陸、中國香港、中國澳門、中國臺灣、蒙古國、新加坡、馬來西亞、菲律賓、西澳大利亞州的時間與UTC的時差均為+8,也就是UTC+8。
new Date()構造函數不傳參情況下,新建的對象自動獲取當前的日期和時間。如果需要根據特定的日期時間創建日期對象,須傳入表示該日期的毫秒數(即從UTC時間的1970年1月1日午夜零時至該日期止經過的毫秒數),為簡化這一過程ECMAScript提供瞭兩個方法:Date.parse()和Date.UTC()。
Date.parse()地區設置為美國的瀏覽器通常接受下列日期格式:
月/日/年
英文月名 日,年
英文星期幾 英文月名 日 年 時:分:秒 時區
如果傳入Date.parse()方法的參數不能表示日期格式,所有瀏覽器返回Invalid Date;
如果可以表示日期的值,但超過范圍,那麼針對不同瀏覽器會返回不同結果(Chrome和Safari返回Invalid Date;其他瀏覽器根據表示的日期往後順延日期<2016年10月34日,10月隻有31天,往後順延就是11月3號>,至於IE版本的問題隻是它們參考不同的時間表示,返回內容還是一樣的);
直接將表示日期的字符串傳給Date(),也會在後臺調用Date.parse(),所以加和不加Date.parse()是等效的;
var date = new Date(); document.write(date + " ");//Sun Oct 16 2016 12:07:09 GMT+0800 (中國標準時間) var date1 = new Date("tt 16,2016"); document.write(date1 + " ");//此字符串不能解析成日期字符串格式,所有瀏覽器返回Invalid Date var date2 = new Date(Date.parse("October 16, 2016")); document.write(date2 + " "); //Sun Oct 16 2016 00:00:00 GMT+0800 (中國標準時間) var date3 = new Date(Date.parse("October 34, 2016")); document.write(date3 + " "); //IE10- Tue Nov 3 00:00:00 UTC+0800 2016 //IE11 Tue Nov 03 2016 00:00:00 GMT+0800 (中國標準時間) //Firefox Tue Nov 03 2016 00:00:00 GMT+0800 //Chrome Invalid Date //Safari Invalid Date var date4 = new Date("October 34, 2016"); document.write(date4 + " ");//Invalid Date或者Thu Nov 03 2016 00:00:00 GMT+0800 var date5 = new Date("October 16, 2016"); document.write(date5 + " ");//Sun Oct 16 2016 00:00:00 GMT+0800 (中國標準時間) var date6 = new Date('10/16/2016'); document.write(date6 + " ");//Sun Oct 16 2016 00:00:00 GMT+0800 (中國標準時間) var date7 = new Date('Sunday October 16,2016 11:34:52 GMT+0800'); document.write(date7 + " ");//Sun Oct 16 2016 00:00:00 GMT+0800 (中國標準時間) document.write("我也執行瞭");
Date.UTC同樣也返回表示日期的毫秒數
new Date(year, month, date, hour, min, sec) 按給定的參數創建一日期對象
參數說明:
year的值為:年份位數為1位或者2位則年份為19xx年(20世紀),3位則年份第一位是0(不合理,不要用三位的年份),四位正常表示年份;
month的值域為0~11,0代表1月,11表代表12月;
date的值域在1~31之間(根據實際情況判斷某年的某月是否有這天);
hrs的值域在0~23之間。從午夜到次日凌晨1點間hrs=0,從中午到下午1點間hour=12;
min和sec的值域在0~59之間。
這種創建方式如果要指定某時某刻則它前面的參數必須一一列舉,否則會報錯;
月和日默認為1,時、分、秒默認為0;
隻有一個參數就會認為是將距1970年1月1日零時的時間戳賦給日期,所以2016毫秒就是2秒;
日期時間表示范圍超過正常范圍,會往後順延(例如:2016年10月32日,變成瞭2016年11月1日;現在Safari和Chrome也不再是返回Invalid Date)
Date()也在模仿Date.UTC(),但沒有規定小時的時候Date()和Date.UTC還是有差別的,Date()的日期時間是按本地時區創建的,而不是GMT;
var date = new Date(); document.write(date + " ");//當前時間:Sun Oct 16 2016 12:30:49 GMT+0800 var date1 = new Date(0); document.write(date1 + " ");//Thu Jan 01 1970 08:00:00 GMT+0800 var date2 = new Date(2016); document.write(date2 + " ");//Thu Jan 01 1970 08:00:02 GMT+0800 var date7 = new Date(Date.UTC(2016,3)); document.write(date7 + " ");//Fri Apr 01 2016 08:00:00 GMT+0800 var date8 = new Date(6,3); document.write(date8 + " ");//Sun Apr 01 1906 00:00:00 GMT+0800 var date9 = new Date(16,3); document.write(date9 + " ");//Sat Apr 01 1916 00:00:00 GMT+0800 var date10 = new Date(116,3); document.write(date10 + " ");//Wed Apr 01 0116 00:00:00 GMT+0800 var date3 = new Date(2016,3); document.write(date3 + " ");//Fri Apr 01 2016 00:00:00 GMT+0800 var date11 = new Date(1876,3,4); document.write(date11 + " ");//Tue Apr 04 1876 00:00:00 GMT+0800 var date4 = new Date(2016,09,3); document.write(date4 + " ");//Mon Oct 03 2016 00:00:00 GMT+0800 var date5 = new Date(2016,9,16,12,35,34); document.write(date5 + " ");//Sun Oct 16 2016 12:35:34 GMT+0800 var date6 = new Date(2016,9,32,12,35,34); document.write(date6 + " ");//Tue Nov 01 2016 12:35:34 GMT+0800
Date的LocaleString()按當前時區形式表示時間,Safari沒有;
toString()顯示的格式就是平時new Date()後的格式,看來new Date()都有調用toString()
valueOf()返回表示的日期距1970年1月1日零時的毫秒數(時間戳)
var date = new Date(); document.write(date.toLocaleString() + " ");//IE:2016年10月16日 13:18:14;Chrome和Firefox:2016/10/16 下午1:18:14;Safari:Sunday, October 16, 2016 13:18:14 document.write(date.toString() + " ");//Sun Oct 16 2016 13:18:22 GMT+0800所有瀏覽器表示形式一樣,隻是後面有沒有顯示(中國標準時間),Safari中國時間四個字顯示亂碼或者IE10-為UTC表示 var date1 = new Date(2016,9,16,13,24,16); document.write(date1.valueOf());//1476595456000
日期格式化方法
toGMTString()與toUTCString()等價的方法,存在的目的是為瞭向後兼容;不過ECMAScript推薦現在編寫的代碼一律用toUTCString();
var date = new Date(); document.write(date.toDateString() + " ");//Sun Oct 16 2016 document.write(date.toTimeString() + " ");//13:38:14 GMT+0800 (中國標準時間) document.write(date.toLocaleDateString() + " ");//IE:?2016?年?10?月?16?日;Chrome和Firefox:2016/10/16;Safari:Sunday, October 16, 2016 document.write(date.toLocaleTimeString() + " ");//IE和Safari:13:40:55;Chrome:下午1:40:55 document.write(date.toUTCString() + " ");//Sun, 16 Oct 2016 05:42:33 GMT IE10-:Sun, 16 Oct 2016 05:42:52 UTC document.write(date.toGMTString() + " ");//Sun, 16 Oct 2016 05:42:33 GMT IE10-:Sun, 16 Oct 2016 05:42:52 UTC
獲取某時間距1970年1月1日零時的時間戳:
Date.parse(dateVal)雖然聲稱是返回日期與 1970 年 1 月 1 日午夜之間所間隔的毫秒數,但是實際上返回的是精確到秒的毫秒數,而並非實際的毫秒。並且這個數字是非四舍五入的,也就是即使是1秒999毫秒,也按照1000毫秒來輸出。而getTime()則返回實際毫秒數。
var date = new Date();//返回當前的日期時間 //getTime()、valueOf()和new Date()返回 1970 年 1 月 1 日至今的毫秒數。 document.write(date + " ");//Sun Oct 16 2016 15:31:51 GMT+0800 document.write(date.getTime() + " ");//1476603111437 document.write(date.valueOf() + " ");//1476603111437 var date1 = +new Date(); document.write(date1 + " ");//1476603111437 var date2 = Date.parse(date); document.write(date2 + " ");//1476603111000毫秒始終是000
時期/時間組件方法
UTC指的是在沒有時區偏差的情況下(將日期轉換為GMT時間)的日期值。其實UTC日期沒什麼好說的就是比我們中國所在的東八區慢8小時;
getTime() 返回1970年1月1日零時至今的毫秒數。 setTime(毫秒) 以毫秒設置日期,會改變日期。 getFullYear() 取得四位數的年份。 getYear() 請使用getFullYear() 方法代替。 getUTCFullYear() 返回UTC日期的4位數年份。 setFullYear(年) 設置日期的年份,傳入的年份值必須是四位數。 setUTCFullYear() 設置UTC日期的年份,傳入的年份值必須是四位數。 setYear(年) 請使用 setFullYear() 方法代替。 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返回星期天,1返回星期六)。 getUTCDay() 返回UTC日期星期中的星期幾。(其中0返回星期天,1返回星期六)。 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(秒) 設置日期中的秒鐘 (0 ~ 59)。傳入的值超過瞭59會增加分鐘數。 setUTCSeconds(秒) 設置UTC日期中的秒鐘 (0 ~ 59)。傳入的值超過瞭59會增加分鐘數。 getMilliseconds() 返回日期中的毫秒(0 ~ 999)。 getUTCMilliseconds() 返回UTC日期中的毫秒(0 ~ 999)。 setMilliseconds() 設置日期中的毫秒 (0 ~ 999)。 setUTCMilliseconds() 設置UTC日期中的毫秒 (0 ~ 999)。 getTimezoneOffset() 返回本地時間與UTC時間相差的分鐘數。