js 將一大段時間均分為很多個小時間段
最近寫項目,遇到一個將選中時間段平均分割為若干小段,然後根據小段時間在資料庫查詢求均值的問題.
最開始只是分固定時間段,每天兩小時一分,也就直接全寫了,後來需求變了,日期選擇輸入,想要多少天就要多少天,時間大了要求取到的數據量還是那麼多
先確定後台需要什麼數據格式,按照存入格式,先寫個方法
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!
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 }
如果有錯誤,麻煩評論區告訴我一聲,萬分感謝,覺得有幫助的點個贊謝謝!
更多優質內容推薦:
2017優就業就業促進計劃:http://www.ujiuye.com/zt/jycj/?wt.bd=zdy35845tt
中公教育「勤工儉學計劃」,給你一個真正0元學習IT的機會!
http://www.ujiuye.com/zt/qgjx/?wt.bd=zdy35845tt


※vue.js用法和特性詳解
※spring cloud+dotnet core搭建微服務架構
※Python內置類型——布爾運算
※MYSQL和JDBC的基礎回顧
※NET 實用擴展方法
TAG:IT優就業 |