今天項目中要獲取本周、本月、本季、本年的第一天,發現網上的方法或多或少都有問題,於是自己寫了一個,親測可用。
同時回顧了一下js日期對象的知識,做個總結
先上代碼:
1 /** 2 * 獲取指定日期的周的第一天、月的第一天、季的第一天、年的第一天 3 * @param date new Date()形式,或是自定義參數的new Date() 4 * @returns 返回值為格式化的日期,yy-mm-dd 5 */ 6 //日期格式化,返回值形式為yy-mm-dd 7 function timeFormat(date) { 8 if (!date || typeof(date) === "string") { 9 this.error("參數異常,請檢查..."); 10 } 11 var y = date.getFullYear(); //年 12 var m = date.getMonth() + 1; //月 13 var d = date.getDate(); //日 14 15 return y + "-" + m + "-" + d; 16 } 17 18 //獲取這周的周一 19 function getFirstDayOfWeek (date) { 20 21 var weekday = date.getDay()||7; //獲取星期幾,getDay()返回值是 0(周日) 到 6(周六) 之間的一個整數。0||7為7,即weekday的值為1-7 22 23 date.setDate(date.getDate()-weekday+1);//往前算(weekday-1)天,年份、月份會自動變化 24 return timeFormat(date); 25 } 26 27 //獲取當月第一天 28 function getFirstDayOfMonth (date) { 29 date.setDate(1); 30 return timeFormat(date); 31 } 32 33 //獲取當季第一天 34 function getFirstDayOfSeason (date) { 35 var month = date.getMonth(); 36 if(month <3 ){ 37 date.setMonth(0); 38 }else if(2 < month && month < 6){ 39 date.setMonth(3); 40 }else if(5 < month && month < 9){ 41 date.setMonth(6); 42 }else if(8 < month && month < 11){ 43 date.setMonth(9); 44 } 45 date.setDate(1); 46 return timeFormat(date); 47 } 48 49 //獲取當年第一天 50 function getFirstDayOfYear (date) { 51 date.setDate(1); 52 date.setMonth(0); 53 return timeFormat(date); 54 }
getYear()返回年份與1900 年之間的差,如1994年返回94,而2009年則會顯示109
getFullYear()返回正確的年份,如2017
getDay() 方法可返回表示星期的某一天的數字。返回值是 0(周日) 到 6(周六) 之間的一個整數。
這里date.getDay()||7將返回值變成了1-7(對應周一到周日)。
getMonth()的返回值比實際月份少1。即0-11表示1月到 12月。我們在打印出來的時候需要getMonth()+1 才會看到正確的月份
同理setMonth(0)表示1月份
setDate() 方法用於設置一個月的某一天。
對於某個日期上加減天數來說,調用setDate()函數就可以了
date.setDate(date.getDate()-n);//前n天的日期
如果前n天的日期是上個月或是去年了,setDate()也會自動設置,會自動改變月份、年份,不需要人工判斷
函數輸入參數date為new Date()形式
var date=new Date();
Date 對象自動使用當前的日期和時間作為其初始值。
也可以自定義時間,參數形式有5種:
1)new Date("month dd,yyyy hh:mm:ss");
2)new Date("month dd,yyyy");
3)new Date(yyyy,mth,dd,hh,mm,ss);
4)new Date(yyyy,mth,dd);
5)new Date(ms);
具體使用如下:
1 new Date("January 12,2006 22:19:35"); 2 3 new Date("January 12,2006"); 4 5 new Date(2006,0,12,22,19,35); 6 7 new Date(2006,0,12); 8 9 new Date(1137075575000);
getFirstDayOfWeek、getFirstDayOfMonth等這幾個函數在使用時要注意,一起使用的時候不能
1 var date = new Date(2017,0,1,22,22,22); 2 3 console.log("當前日期:",date); 4 console.log("當前日期格式化:",timeFormat(date)); 5 console.log("本周第一天:",getFirstDayOfWeek(date)); 6 console.log("本月第一天:",getFirstDayOfMonth(date)); 7 console.log("本季第一天:",getFirstDayOfSeason(date)); 8 console.log("本年第一天:",getFirstDayOfYear(date));
這樣使用,因為 getFirstDayOfWeek(date) 函數直接是setDate的,這個date值已經發生了變化了,后面幾個函數使用時已經不是最開始定義的date了,與我們的預期不符~(一開始就栽在這里了,明明感覺函數都對,輸出值就是與預期不一樣)
要一起使用時最好每個參數都new Date()一下,以2017.1.1為例:
1 console.log("當前日期:",new Date(2017,0,1)); 2 console.log("當前日期格式化:",timeFormat(new Date(2017,0,1))); 3 console.log("本周第一天:",getFirstDayOfWeek(new Date(2017,0,1))); 4 console.log("本月第一天:",getFirstDayOfMonth(new Date(2017,0,1))); 5 console.log("本季第一天:",getFirstDayOfSeason(new Date(2017,0,1))); 6 console.log("本年第一天:",getFirstDayOfYear(new Date(2017,0,1)));
輸出
成功了~