jsDate開發_JavaScript時間功能開發技巧

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時間相差的分鐘數。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *