Date日期時間相關
阿新 • • 發佈:2017-09-20
sep console 我們 時區 偏差 val subst ie9 oda 最近在封裝一個關於時間函數的功能時,竟發現這些最基本的函數都有些生疏,於是進來來總結復習下,鞏固自己記憶的同時,希望能幫助到需要的人
首先了解下日期對象相關的方法
var date = new Date();// 使用new+構造函數Date創建一個對象 console.log(date); // date內部相當於默認的調用了toString(): Tue Sep 19 2017 08:54:04 GMT+0800 (中國標準時間) console.log(date.toString()); // Tue Sep 19 2017 08:54:04 GMT+0800 (中國標準時間) console.log(date.toDateString()); //外國的的顯示方式: Tue Sep 19 2017 console.log(date.toLocaleDateString()); // 年月日 : 2017/9/19 console.log(date.toTimeString()); // 外國人喜歡看的方式: 08:54:04 GMT+0800 (中國標準時間) console.log(date.toLocaleTimeString()); //國內喜歡看的方式: 上午8:54:04
看到這裏是不是覺得太多而且類似不好記,其實並不用全部記住,只要記住new Date()就行,其他的等用到的時候看看就行。下面我們就這個方法展開:
// 1.註意:在用new Date()創建對象的時候傳入的是2016,10,1,而打印的結果是11月,這是因為日期格式的月份是從0開始的,10自然就代表11月了。
//日期格式的月份是從0開始的,即0-11位1-12月, var date = new Date(2016,10,1); console.log(date); // Tue Nov 01 2016 00:00:00 GMT+0800 (中國標準時間)
// 2.看看這次傳入的對象,估計很多人已然會覺得會打印11月,如果這樣想你就錯了,這裏傳入的是字符串,與上面的不一樣,該方法會將字符串中的內容轉化成相應的月份。要註意與上面的分開哦 // 註意這種字符串形式的和上面從number類型的不一樣,這裏的月份就是對於的1-12 var date = new Date("2016-10-1"); //正常的輸出 10月1號 console.log(date); //Sat Oct 01 2016 00:00:00 GMT+0800 (中國標準時間)
// 3.現在我們來聊聊時間戳,別被這個名詞給忽悠住了,其實他就是時間的毫秒形式,也就是從格林威治時間到現在的毫秒數
// 下面5種方法都可以得到時間戳,估計很多人不樂意了,這怎麽記得住,沒關系,只要記住常用的就行。如:Date.now() 和 new Date("1970-1-1").getTime(),一個是當前時間,一個是任意時間 var date = Date.parse("2016-10-1"); var date = new Date("1970-1-1 0:0:0").getTime() // 註意打印這個結果是-28800000,剛好偏差了8小時,要註意時區的概念,背景時間應該是1970.1.1 8;00才為0的 console.log(date);//1475251200000 13位的毫秒形式 1970 1 1 00:00:00:000 // 日期的本質就是13位的毫秒數字 這樣的好處是為了便於計算 var date = +new Date(); // 獲取當前的13位數字表示的時間 console.log(date); // 1505784006569 var date = Date.now(); //HTML5擴展的 IE9+ console.log(date); // 1505784030664 var date = new Date(); console.log(date.valueOf());//打印對象的原來的值,其實就是13位的數字 1505784077460
獲取日期時間的指定部分
/** getTime() 返回毫秒數和valueOf()結果一樣 getMilliseconds() getSeconds() 返回0-59 getMinutes() 返回0-59 getHours() 返回0-23 getDay() 返回星期幾 0周日 6周6 getDate() 返回當前月的第幾天,當月的幾號 getMonth() 返回月份,從0開始 getFullYear() 返回4位的年份 如 2016 */ var date = new Date(); console.log(date.getTime()); // 和valueOf的效果是一樣的,用來獲取13位的毫秒數字 console.log(date.getMilliseconds()); console.log(date.getSeconds()); console.log(date.getMinutes()); console.log(date.getHours()); console.log(date.getDay()); // 星期幾 周 禮拜幾 console.log(date.getDate()); // 當前月份的第幾天 幾號 console.log(date.getMonth()); //顯示的是1,因為這裏也是從0開始 console.log(date.getFullYear());
熟悉這些API後,讓我們封裝一個常見的日期格式函數來練練手吧(非常常見的筆試題目哦,看到了就是賺到了)
function getDate(date) { var year = date.getFullYear(); var month = date.getMonth() + 1; // 月份是從0開始 var day = date.getDate();//獲取的是當月的幾號 var hour = date.getHours(); var min = date.getMinutes(); var sec = date.getSeconds(); month = month < 10 ? "0" + month : month; day = day < 10 ? "0" + day : day; hour = hour < 10 ? "0" + hour : hour; min = min < 10 ? "0" + min : min; sec = sec < 10 ? "0" + sec : sec; var str = year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + sec; console.log(str); } var date = new Date(); getDate(date); // 把創建的date作為參數傳進來
最後再來看看一個關於日期時間的bug。萬惡的IE一直是前端學習的噩夢,各種兼容,今天的主角依然是他。以往的兼容是由於IE的版本比價底的緣故,這也難怪,早期的他並沒有想的那麽全面。可是這個bug知道IE11都還有,我就不知道該說什麽了,
可能某些人存在店大欺客的味道,就象ICBC(愛存不存)一樣,你愛用不用。那我們就來看看是什麽,以及怎麽解決吧!
在IE11之前(包括IE11,但是edge是可以識別的)都是不識別這種橫杠模式的時間,如:new Date("1970-1-1 0:0:0"),一定要轉化成斜杠才能識別new Date("1970/1/1 0:0:0"),因此在使用前必須通過正則去替換:replace(new RegExp("-","gm"),"/");,
順帶普及下string的replace方法。replace(regexp/substr,replacement)是字符串函數,第一個參數是要替換的字符或者正則模式匹配的字符串,第二個參數則是替換文本或生產替換文本的函數看完後,是不是對這些API思路更清晰了
Date日期時間相關