js內置對象之Date
Date對象:封裝一個時間點,提供操作時間的API。Date對象中封裝的是從1970年1月1日0點至今的毫秒數。
1、創建Date對象(4種)
(1)創建Date對象同時獲得當前系統時間,指的是客戶端系統的當前時間
var now = new Date();
(2)創建日期對象,同時自定義時間,形如:Date("yyyy/MM/dd[ hh:mm:ss]")
var date = new Date("1994/04/06 03:23:55");
(3)創建日期對ixnag,同時自定義時間:由於計算機中日期MM從0開始計算,范圍是0~11,使用時MM需要加1
var date = new Date(yyyy, MM, dd, hh, mm, ss);
(4)復制一個對象
var oldDate = new Date("1994/04/06"); var newDate = new Date(oldDate.getTime());//參數可以是一個日期,也可以是一個毫秒數
2、日期API
日期分量:FullYear、Month、Date、Day、Hours、Minutes、Seconds、Milliseconds
2.1 每個分量都有一對get和set方法
getXXX()用於獲取指定分量的值;setXXX()用於設置指定分量的值,可以自動調整時間進制。Day分量沒有set方法,因為星期是根據日期換算出來的。
2.2 分量命名規律
年月日星期,后沒有s,直接是英文;時分秒毫秒,后有s
2.3 取值范圍
只有月中的日date分量是從1開始到31結束;其余都是從0開始,到進制最大量-1結束
| getXXX() | setXXX() | 意義 | 范圍 | 備注 |
| date.getFullYear() | date.setFullYear() | 年 | ||
| date.getMonth() | date.setMonth() | 月 | 0~11 | 使用時get方法 獲得的值需要+1 |
| date.getDate() | date.setDate() | 日 | 1~31 | |
| date.getDay() | 無 | 星期 | 0~6 | |
| date.getHours() | date.setHours() | 時 | 0~23 | |
| date.getMinutes() | date.setMinutes() | 分 | 0~59 | |
| date.getSeconds() | date.setSeconds() | 秒 | 0~59 | |
| date.getMilliseconds() | date.setMilliseconds() | 毫秒 |
3、計算日期(2種)
1)求時間差:
日期-日期=毫秒差
日期-毫秒數=毫秒數
由於每個月的天數不一樣,故此方法一般用於一個月之內的時間差計算。
2)對日期的任意分量做計算:3布
①取分量:使用對應的get方法
②計算
③設置分量:使用對應的set方法
簡寫:date.setXXX(date.getXXX()+n);
set方法是直接修改原日期。
4、日期轉字符串
1) String(date):返回中國標准時間格式的字符串
2)date.toLocaleString():返回客戶端當地時間格式,包含日期和時間。
3)date.toLocaleDateString():返回客戶端當地時間格式,只包含日期部分
4)date.toLocaleTimeString():返回客戶端當地時間格式,僅包含時間部分
不足:①方法名太長,不利於記憶;②兼容性問題,不同瀏覽器輸出的效果不一樣
5、練習
5.1 計算合同到期時間等
要求:①創建Date對象保存員工入職日期;②合同有效期為3年,計算合同到期時間;③合同到期前,需要提前一個月續簽。如果提前一月的續簽時間剛好是周末,則需要提前到上一個周五,計算續簽時間;④要求在續簽時間前一周,向員工發出續簽提醒,計算提醒時間。
//入職時間 var hireDate = new Date("2012/6/30"); //賦值對象給endDate var endDate = new Date(hireDate.getTime()); endDate.setFullYear(endDate.getFullYear()+3); // var resumeDate = new Date(endDate.getTime()); resumeDate.setMonth(resumeDate.getMonth()-1); if(resumeDate.getDay()==6){ resumeDate.setDate(resumeDate.getDate()-1); } if(resumeDate.getDay()==0){ resumeDate.setDate(resumeDate.getDate()-2); } var alertDate = new Date(resumeDate.getTime()); alertDate.setDate(alertDate.getDate()-7); console.log("到期時間:"+endDate.toLocaleDateString()); console.log("續簽時間:"+resumeDate.toLocaleDateString()); console.log("提醒時間:"+alertDate.toLocaleDateString());
5.2 計算明天開始,任意工作日之后的日期
var now = new Date(); var days = 10; for(var i=0;i<days;i++){ /*if(now.getDay()==5){ now.setDate(now.getDate()+2); }else if(now.getDay()==6){ now.setDate(now.getDate()+1); } now.setDate(now.getDate()+1);*/ //簡寫 now.setDate(now.getDate() + (now.getDay()==5 ? 3 : now.getDay()==6 ? 2 : 1)); } console.log(now.toLocaleDateString());
5.3 自定義format方法,格式化日期
//返回形如“2017年3月2日 星期四 上午 11:12:31” function format (date){ var days = ["星期日","星期一","星期二","星期三","星期四","星期五","星期6"]; //獲取date的年份 var year = date.getFullYear(); //獲取date的月份,將月份格式化成兩位數保存 var month = date.getMonth()<10 ? "0"+date.getMonth() : date.getMonth(); //獲取date的日期,將日期格式化成兩位數保存 var d = date.getDate()<10 ? "0"+date.getDate() : date.getDate(); //從days數組中獲得date的星期對應位置的星期名 var day = days[date.getDay()]; //獲得date的小時,保存為兩位數 var hour = date.getHours(); var am = hour<12 ? "上午" : "下午"; hour = hour<12 ? hour : hour-12; var minute = date.getMinutes(); var second = date.getSeconds(); return year+"年"+month+"月"+d+"日 "+day+" "+am+" "+hour+":"+minute+":"+second; } console.log(format(new Date()));
