當前位置:
首頁 > 知識 > js 將一大段時間均分為很多個小時間段

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

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

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

TAG:IT優就業 |