/** *需求:同年同月,同年不同月(兩個月相減大於1,小於1),不同年(兩個年相減大於1(是否為閏年),小於1),起止包含的月份及天 */
//首先引入組件 import { DatePicker} from 'antd'; const { RangePicker } = DatePicker; //render中引入 <RangePicker style={{marginRight: 15}} format="YYYY-MM-DD" onChange={this.filterByDayRange} />
//接下來是功能函數 //計算開始天數差 getStartEnd = (year, month, date) => { let number = 0; let start_day = parseInt(date); let end_day = parseInt(getMonthEndDate(year,month-1).split('-')[2]); return Math.abs(parseInt(end_day) - parseInt(start_day) + 1) } // 判斷某一年是平年還是閏年 isLeapYear = (year) => { let number = 0; ((year%4==0) && (year%100!=0)) || (year%400==0) ? number = 366 : number = 365; // console.log(number) return number; } //獲取當兩個年份差為1的天數 getBetweenYears = (_year1,_year2,month1,month2,date1,date2) => { // 第一個日期 let monthRange1 = []; let month1_mun1 = 0; let other_num1 = 0; let len1 = 12 - parseInt(month1); if(len1 > 0){//若果月份之差大於0 for(var j = 1; j <= len1; j ++){ let _m1 = getMonthEndDate(_year1,Math.abs((parseInt(month1)+j) - 1)).split('-')[2]; monthRange1.push(parseInt(_m1)) } other_num1 = monthRange1.reduce((sum,item) =>{//前面其他部分 return sum + item; },0); month1_mun1 = this.getStartEnd(_year1,month1,date1);//前面第一部分 }else{//如果當前月為12月 month1_mun1 = this.getStartEnd(_year1,month1,date1);//前面第一部分 } // 第二個日期 let monthRange2 = []; let month2_mun1 = 0; let other_num2 = 0; let len2 = parseInt(month2) - 1; if(len2 > 0){//若果月份之差大於0 for(var k = 1; k <= len2;k ++){ let _m2 = getMonthEndDate(_year2,Math.abs((parseInt(month2)-k) - 1)).split('-')[2]; monthRange2.push(parseInt(_m2)) } other_num2 = monthRange2.reduce((sum,item) =>{//前面其他部分 return sum + item; },0); month2_mun1 = parseInt(date2);//前面第一部分 }else{//如果當前月為1月 month2_mun1 = parseInt(date2);//前面第一部分 } return parseInt(month1_mun1) + parseInt(other_num1) + parseInt(month2_mun1) + parseInt(other_num2); } //計算天數(判斷平年,閏年的天數) getDayNum = (day1, day2) => { let _num;//天數 // console.log(day1, day2) let startArr = day1.split('-'), endArr = day2.split('-'), _year1 = startArr[0], _year2 = endArr[0], month1 = startArr[1], month2 = endArr[1], date1 = startArr[2], date2 = endArr[2]; if(_year1 == _year2){//同一年 if(month1 == month2){//同年同月 // console.log(month1) _num = Math.abs(parseInt(startArr[2]) - parseInt(endArr[2])) + 1; // console.log("同年同月",_num) }else{//同年不同月 //計算month1和month2之間的月份 let monthRange = []; let len = parseInt(month2) - parseInt(month1); // console.log(len) if(len > 1){//如果兩個月相減大於1,統計中間的月份 for(var i = 1; i < len; i++){ let _m = getMonthEndDate(_year1,Math.abs((parseInt(month1)+i) - 1)).split('-')[2]; monthRange.push(parseInt(_m)) } let other_num = monthRange.reduce((sum,item) =>{ return sum + item; },0); let month1_mun = this.getStartEnd(_year1,month1,date1); let month2_mun = parseInt(date2); _num = parseInt(month1_mun) + parseInt(month2_mun) + parseInt(other_num); // console.log("同年不同月且月份相差大於1",_num) }else{//如果兩個月相減為1 let month1_mun = this.getStartEnd(_year1,month1,date1); let month2_mun = parseInt(date2); _num = parseInt(month1_mun) + parseInt(month2_mun); // console.log("同年不同月且月份相差等於1",_num) } } }else{//不是同一年 let yearRange = []; let other_year_num = 0; let _len = _year2 - _year1; if(_len > 1){ for(var h = 1; h < _len; h++){ let _y = parseInt(_year1 + h); yearRange.push(this.isLeapYear(_y)) } other_year_num = yearRange.reduce((sum,item) =>{ return sum + item; },0); let other_month_num = this.getBetweenYears(_year1,_year2,month1,month2,date1,date2); _num = parseInt(other_year_num) + parseInt(other_month_num); // console.log("不同年且年份相減大於1",_num) }else{ _num = this.getBetweenYears(_year1,_year2,month1,month2,date1,date2); // console.log("不同年且年份相減等於1",_num) } } return _num; } //根據時間范圍filterByDayRange filterByDayRange = (value,dateString) => { // console.log(dateString) if(dateString[0] != ''){ let _num = this.getDayNum(dateString[0], dateString[1]); let _startTime = dateString[0] + ' 00:00:00';; let _endTime = dateString[1] + ' 23:59:59'; this.setState({ startTime: _startTime, endTime: _endTime, num: _num, current: 1 }, () => { this.fetch(this.state.current, this.state.pageSize,this.getParamsObj()); }) }else{ let start_end = this.getCurrentMonth(); this.setState({ startTime:start_end.start, endTime:start_end.end, current:1 }, () => { this.fetch(this.state.current, this.state.pageSize,this.getParamsObj()); }) } }