在做項目的時候,有這樣一個需求,需要選擇時間段,於是在網上找了bootstrap的雙日歷時間控件daterangepicker控件,要選取時間段的年月來與后台進行數據交互,時間控件如下圖所示:
關於控件的初始化在這里就不做介紹了,初始化完成后選擇時間,點擊確定按鈕會觸發控件的回調函數會把你選擇的時間傳給你,如圖:
start是選擇的開始時間,end是選擇的結束時間。在這里對start和end要做轉換才可以使用。本身以為這樣挺好的,滿足了需求。后來在測試的過程中,發現當開始時間選擇每月1日的時候,實際取的是選擇的前一天,比如我選擇的開始時間是4月1日,實際取得的是3月31日,導致獲取的數據不一致。然后針對開始時間,針對項目的需求就需要對開始時間做處理,由於項目只需要傳遞年月,所以對這兩個做處理,大致思路是這樣:首先選擇1日后,要看返回的前一天是31、30、29還是28,因為每年的1、3、5、7、8、10、12月是31天,而4、6、9、11月是30天,2月份要看當前年份是否是閏年,分為29天或28天。然后當返回日期是31或者30的時候,當月份是12月的時候還需要把年份加1,12月要變成01月,其他的是需要月份加1即可,最后當返回日期是29或28的時候,要判斷是否是2月,因為這種情況下只有2月才需要改變月份,這里需要判斷是否是閏年,因為閏年2月有29天,判斷成立后直接把月份改成03。以上所描述的適用於開始時間是1日的情況。下面是我對於以上思路的實現:
//開始時間選擇1號時處理 function specialDate(startArray){ if(startArray[2].substring(0,2)==31){ if(startArray[1]=="01" || startArray[1]=="03" || startArray[1]=="05" || startArray[1]=="07" || startArray[1]=="08" || startArray[1]=="10" || startArray[1]=="12"){ if(startArray[1]=="12"){ startArray[0] = parseInt(startArray[0])+1; startArray[1]='01'; }else{ startArray[1] = parseInt(startArray[1])+1; if(startArray[1]<10){ startArray[1] = '0'+startArray[1]; } } } }else if(startArray[2].substring(0,2)==30){ startArray[1] = parseInt(startArray[1])+1; if(startArray[1]<10){ startArray[1] = '0'+startArray[1]; } }else if(startArray[2].substring(0,2)==29 || startArray[2].substring(0,2)==28){ if(startArray[1] == 02){ //判斷是否是閏年 if((startArray[0] % 4 == 0) && (startArray[0] % 100 != 0 || startArray[0] % 400 == 0)){ if(startArray[2].substring(0,2)==29){ startArray[1] = "03"; } }else{ startArray[1] = "03"; } } } }
代碼注釋不多,有不懂或者不理解的歡迎留言~