js 將一大段時間均分為很多個小時間段


最近寫項目,遇到一個將選中時間段平均分割為若干小段,然后根據小段時間在數據庫查詢求均值的問題,后台大哥犯懶,非說后台做不了,讓我分好傳給他ヾ(。 ̄□ ̄)ツ゜゜゜好氣呦,但還要保持微笑,我就是這么懂禮貌的好孩子ー( ̄~ ̄)ξ

 

閑話不多說,來說實現過程

最開始只是分固定時間段,每天兩小時一分,也就直接全寫了,后來需求變了,日期選擇輸入,想要多少天就要多少天,時間大了要求取到的數據量還是那么多

我:不太好實現啊老板

boss:啥?別人都能做到,你咋就做不到?你這技術水平怕是有點低了把?

我:那我試試(MDZZ)

先確定后台需要什么數據格式,按照存入格式,先寫個方法

1 function range(beginTime, endTime) {//存入格式
2     this.beginTime = beginTime;
3     this.endTime = endTime;
4 }

考慮到這是一個js文件,數據分割也是固定的等分,就寫一個從外部獲取參數的函數吧,TimeRange(startTime,endTime)函數用來供頁面調用,只傳入開始時間,結束時間,不寫分多少組了,因為需要的數據總量一般都是固定的,分多少組也是固定的,哪里需要直接來js改就好了

1  function TimeRange(startTime, endTime) { //傳入開始時間var startTime 傳入結束時間var endTime 傳入格式xxxx-xx-xx 年月日
2     var amount = 100; //定義分多少組
3     var startTimes = startTime + " 00:00:00"; //日期添加時分秒 開始日期
4     var endTimes = endTime + " 23:59:59"; //日期添加時分秒 結束日期
5

 

判斷一波

1 if(endTimes <= startTimes) {
2         alert('結束日期必須大於開始日期!');
3         return -1;
4     }
5 
6     if(dataDiff > 15) {
7         alert('單次查詢日期不超過兩周,請重新選擇!');
8         return -2;
9     }

既然平均分,那就得知道時間間隔,計算時間間隔,寫個方法直接調用

 1 //計算天數差的函數,通用
 2 function DateDiff(sDate1, sDate2) { //sDate1和sDate2是2006-12-18格式  
 3     var aDate, oDate1, oDate2, iDays
 4     aDate = sDate1.split("-")
 5     oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0]) //轉換為12-18-2006格式  
 6     aDate = sDate2.split("-")
 7     oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
 8     iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 / 24) //把相差的毫秒數轉換為天數  
 9     return iDays
10 }

 

整理了一下邏輯,偽代碼如下

 1     //計算時間段總時間,分割后每段時間間隔,單位(秒)
 2         var timeRange;//存儲計算出的時間段
 3         var timeAll ; //總時間間隔
 4         var timeGap ; //分割后時間間隔
 5         var slidingTime = 0; //循環開始條件
 6         var momentTime_front; //時間段前一個值
 7         var momentTime_rear;//時間段后一個值
 8         for(slidingTime; slidingTime < timeAll; slidingTime += timeGap) {
 9             momentTime_front = 計算出的時間前半部分
10             momentTime_rear = 計算出的時間后半部分
11             timeRange.push(new range(momentTime_front, momentTime_rear));//將計算后的小段的開始時間和結束時間組合存入timeRange
12         }
13         return timeRange;
14     } 

 

 

實現后的TimeRange()方法如下:

 1 function TimeRange(startTime, endTime) { //傳入開始時間var startTime 傳入結束時間var endTime
 2     var amount = 100; //定義分多少組
 3     var timeRange = new Array(); //return數組初始化
 4     var dataDiff = DateDiff(startTime, endTime); //計算兩個日期相差天數
 5     var startTimes = startTime + " 00:00:00"; //日期添加時分秒 開始日期
 6     var endTimes = endTime + " 23:59:59"; //日期添加時分秒 結束日期
 7 
 8     if(endTimes <= startTimes) {
 9         alert('結束日期必須大於開始日期!');
10         return -1;
11     }
12 
13     if(dataDiff > 15) {
14         alert('單次查詢日期不超過兩周,請重新選擇!');
15         return -2;
16     }
17     if(1) {
18         //計算時間段總時間,分割后每段時間間隔,單位(秒)
19         var timeAll = (dataDiff + 1) * 24 * 3600; //總時間間隔
20         var timeGap = timeAll / amount; //分割后時間間隔
21         var slidingTime = 0; //循環開始
22         var momentTime_front;  
23         var momentTime_rear;
24         for(slidingTime; slidingTime < timeAll; slidingTime += timeGap) {
25             momentTime_front = addDatetime(startTimes, slidingTime)
26             momentTime_rear = addDatetime(startTimes, (slidingTime + timeGap - 1))
28             timeRange.push(new range(momentTime_front, momentTime_rear));
29         }
30         return timeRange;
31     }
32 }

 

接下來的問題就是如何計算 momentTime_front 和 momentTime_rear 了

我的思路是將開始時間加上秒數轉換后的日時分秒等再相加,直接添加的語句或者方法沒找到,那咋辦?還把我難住了?找不到算了,技不如人,不如自己寫一個方法,直接計算兩個字符串類型的時間格式相加,哼╭(╯^╰)╮

先想想怎么寫,需要現將字符串轉換成字符串類型的數組,將年月日時分秒都分開才能逐個擊破,分開后的數組都是字符串類型,沒法進行加減運算,強轉!先寫個將日期類型轉換為整型數組的方法

 1 //傳入'1970-01-01 00:00:00' 將其分成可計算的整形數組[1970,1,1,0,0,0]
 2 function getArray(dataTime) {
 3     dataTime = dataTime.replace(/ /, "-")
 4     var timesArray = dataTime.split("-");
 5     var timeArray = timesArray[3].split(":");
 6     timesArray[0] = parseInt(timesArray[0]);
 7     timesArray[1] = parseInt(timesArray[1]);
 8     timesArray[2] = parseInt(timesArray[2]);
 9     timesArray[3] = parseInt(timeArray[0]);
10     timesArray[4] = parseInt(timeArray[1]);
11     timesArray[5] = parseInt(timeArray[2]);
12     return timesArray;
13 }

 

ok,能計算了,但是增加的時間是秒,還得把秒轉換成年月日時分秒格式

 1 //將秒轉換為日期格式(最高到天)
 2 function getDatetime(s) {
 3     var dataTime = new Array;
 4     //存入 秒
 5     dataTime[5] = parseInt((s / 1) % 60);
 6     //存入 分
 7     dataTime[4] = parseInt((s / 60) % 60);
 8     //存入 時
 9     dataTime[3] = parseInt((s / 60 / 60) % 24);
10     //存入 日
11     dataTime[2] = parseInt(s / 60 / 60 / 24);
12     //存入 月
13     dataTime[1] = parseInt(0);
14     //存入 年
15     dataTime[0] = parseInt(0);
16     return dataTime;
17 }

 

好嘞,需要的類有了,可是時間相加,不是簡單的數字相加啊,還要考慮閏年問題,大月小月問題,嗯....計算大月小月

 1 //獲取當月天數
 2 function getMonthDay(years, month) {
 3     switch(month) {
 4         case "2":
 5             if(years % 4 == 0 && years %100 !=0) {
 6                 return "29";
 7             } 
 8             if(years % 4 == 0 &&years % 100 == 0 && years % 400 == 0) {
 9                 return "29";
10             } else {
11                 return "28";
12             }
13             return "28";
14         case "4":
15             return "30";
16         case "6":
17             return "30";
18         case "9":
19             return "30";
20         case "11":
21             return "30";
22         default:
23             return "31";
24     }
25 }

 

 

因為生成的結果是個數組,我們認識,但是計算機傻呀,還要在轉換為輸入的日期格式的字符串,逆向的過程

 1 //將datetime日期數組轉換為string類型
 2 function dataTimetoString(dateTime) {
 3     for(i = 0; i <= 5; i++) {
 4         dateTime[i] = dateTime[i].toString();
 5     }
 6     var dataTime_Str = "";
 7     //添加 年
 8     dataTime_Str += dateTime[0] + "-";
 9     //添加 月
10     if(dateTime[1].length == 2) {
11         dataTime_Str += dateTime[1] + "-";
12     } else {
13         dataTime_Str += "0" + dateTime[1] + "-";
14     }
15     //添加 日
16     if(dateTime[2].length == 2) {
17         dataTime_Str += dateTime[2] + " ";
18     } else {
19         dataTime_Str += "0" + dateTime[2] + " ";
20     }
21     //添加 時
22     if(dateTime[3].length == 2) {
23         dataTime_Str += dateTime[3] + ":";
24     } else {
25         dataTime_Str += "0" + dateTime[3] + ":";
26     }
27     //添加 分
28     if(dateTime[4].length == 2) {
29         dataTime_Str += dateTime[4] + ":";
30     } else {
31         dataTime_Str += "0" + dateTime[4] + ":";
32     }
33     //添加 秒
34     if(dateTime[5].length == 2) {
35         dataTime_Str += dateTime[5];
36     } else {
37         dataTime_Str += "0" + dateTime[5];
38     }
39     return dataTime_Str;
40 }

 

 

好啦,准備工作全部完成,開始我們核心的增加的計算啦,各種小細節問題,想起來就頭疼,好在解決了,不細說啦,Showtime!       ヾ(≧O≦)〃嗷~ヾ

 1 //將兩個日期相加后的結果返回
 2 function addDatetime(dt, s) {
 3     var dateTime = new Array; //創建數組
 4     var addDatetime = new Array; //創建數組
 5     var dataTimeStr = new Array; //創建數組
 6     dateTime = getArray(dt); //將字符串類型的時間轉換為整形數組
 7     addDatetime = getDatetime(s); //將間隔時間秒轉換為日期格式的整形數組
 8     var count = 0;//存儲進位
 9 
10     dataTimeStr[5] = (dateTime[5] + addDatetime[5] + count) % 60; //
11     ((dateTime[5] + addDatetime[5] + count) > 59) ? count = 1: count = 0;
12 
13     dataTimeStr[4] = (dateTime[4] + addDatetime[4] + count) % 60; //
14     ((dateTime[4] + addDatetime[4] + count) > 59) ? count = 1: count = 0;
15 
16     dataTimeStr[3] = (dateTime[3] + addDatetime[3] + count) % 24; //
17     ((dateTime[3] + addDatetime[3] + count) > 23) ? count = 1: count = 0;
18 
19     var m = getMonthDay(dateTime[0].toString(), dateTime[1].toString());
20     dataTimeStr[2] = (dateTime[2] + addDatetime[2] + count) % m; //
21     ((dateTime[2] + addDatetime[2] + count) > m) ? count = 1: count = 0;
22     if(dataTimeStr[2] == 0) {
23         dataTimeStr[2] = (dateTime[2] + addDatetime[2] + count) % (m + 1);
24         count = 0;
25     }
26     dataTimeStr[1] = (dateTime[1] + addDatetime[1] + count) % 12; //
27     ((dateTime[1] + addDatetime[1] + count) > 12) ? count = 1: count = 0;
28     if(dataTimeStr[1] == 0) {
29         dataTimeStr[1] = (dateTime[1] + addDatetime[1] + count) % 13;
30         count = 0;
31     }
32 
33     dataTimeStr[0] = (dateTime[0] + addDatetime[0] + count) / 1; //
34 
35     var dataTime_str = dataTimetoString(dataTimeStr); //將日期格式的數組轉換為字符串
36     return dataTime_str;
37 }

 

如果有錯誤,麻煩評論區告訴我一聲,萬分感謝,覺得有幫助的點個贊謝謝,撒油那啦...ヾ( ̄▽ ̄)Bye~Bye~

 

 

做了修改,新的鏈接貼上來,超簡單,感謝評論

http://www.cnblogs.com/xichuanggushi/p/7851979.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM