最近写项目,遇到一个将选中时间段平均分割为若干小段,然后根据小段时间在数据库查询求均值的问题,后台大哥犯懒,非说后台做不了,让我分好传给他ヾ(。 ̄□ ̄)ツ゜゜゜好气呦,但还要保持微笑,我就是这么懂礼貌的好孩子ー( ̄~ ̄)ξ

闲话不多说,来说实现过程

最开始只是分固定时间段,每天两小时一分,也就直接全写了,后来需求变了,日期选择输入,想要多少天就要多少天,时间大了要求取到的数据量还是那么多

我:不太好实现啊老板

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 }

好嘞,需要的类有了,可是时间相加,不是简单的数字相加啊,还要考虑闰年问题,大月小月问题,嗯....计算大月小月

【本文由“java程序”发布,2017年10月14日】

js 将一大段时间均分为很多个小时间段相关推荐

  1. 绑定bindchange事件的微信小程序swiper闪烁,抖动问题解决,(将微信小程序切换到后台一段时间,再打开微信小程序,会出现疯狂循环轮播,造成抖动现象)

    绑定bindchange事件的微信小程序swiper闪烁,抖动问题解决,(将微信小程序切换到后台一段时间,再打开微信小程序,会出现疯狂循环轮播,造成抖动现象) 参考文章: (1)绑定bindchang ...

  2. Python实现过段时间计算机自动锁屏小程序

    1.直接上代码: from ctypes import * import timeprint("是时候展示真正的技术了,哈哈哈") # 睡眠一段时间 time.sleep(10) ...

  3. TSINGSEE青犀视频H265播放器FLV.js播放一段时间后报内存不足怎么处理?

    EasyPlayer随着多年不断的更新和迭代,不断基于成功的实践经验,发展出包括有: EasyPlayer RTSP.EasyPlayer RTMP.EasyPlayerPro 和EasyPlayer ...

  4. 原生js获取一段时间内每隔几分钟的时间数组

    姊妹篇 原生js获取一段时间内每隔几天的时间数组 情况: 项目中有这么一个需求,输入开始时间.结束时间.时间间隔,获取一段时间内每隔几分钟的时间数组 接下来我必须现在网上找找有没有类似的稍微改改就好了 ...

  5. 我如何在Node.js(Javascript)中等待,我需要暂停一段时间

    本文翻译自:How Can I Wait In Node.js (Javascript), l need to pause for a period of time I'm developing a ...

  6. 看了很多人的面试经验,我也来一段:这段时间的几个面试

    泉州巴黎婚纱摄影 店门口摆了个牌子,说招聘 20 名数码师,月薪 2000-4000 .又在网上也看到招聘启事,投了. 投完,人才网收到个面试通知,不过简历状态竟然是未阅?通知人面试连简历都不看的?打 ...

  7. js中间隔一段时间执行

    js中间隔一段时间执行 var arr = [1, 2, 3, 4, 5] var i = 0 // 在外面定义一个变量作为判断的标准 var timer = setInterval(function ...

  8. JS每隔一段时间执行一个方法

    function funcTest(){ //每隔3秒执行一次timelyFun方法 window.setInterval("timelyFun()",3000); } windo ...

  9. JS设置等待一段时间再执行

    function sleep(milliSeconds) {var startTime = new Date().getTime();while (new Date().getTime() < ...

最新文章

  1. .NET Garbage-Collectors
  2. 微软企业库4.1学习笔记(八)创建对象 续集2
  3. 4到20ma模拟量转换公式_西门子 S7-1200 模拟量转换
  4. 在做自动化测试之前你需要知道的,转自:http://www.cnblogs.com/fnng/p/3653793.html
  5. WeMos下实现小车避障与手机控制
  6. Django 07. django框架模型之增删改查基本操作
  7. 编写一个Applet,随机选择矩形、圆形、椭圆、直线等形状,在可视区域内绘制20个图形,同一种图形使用同一种颜色,不需要填充。
  8. 如何为Linux系统中的SSH添加双重认证
  9. 数据库系统教程-面试汇总-合集
  10. 用计算机检索生物学文献,文献检索期末复习
  11. 点聚AIP电子签章在Chrome、Edge新内核、360系列、FireFox、IE、Opera等浏览器中实现网页内嵌效果案例(一)
  12. 三目运算(三目表达式)是什么?
  13. linux 查找mysql rpm包位置_linux如何查看rpm包的安装路径办法
  14. DAZ场景转换进3Dmax
  15. android启用hdcp_如何在Android的Google键盘中启用单手模式
  16. php插入图片适应屏幕,PHPExcel:如何在首页页眉中插入图片并将其放大以适应其内容?...
  17. 介绍计算机方队,方阵
  18. java 实现站内信_群发站内信实现
  19. 二极管1N4148w
  20. 少走弯路的3个忠告:产品经理不是来改变世界的

热门文章

  1. 计算机系统中处理的信息是什么,《深入理解计算机系统》第二章 信息的表示和处理...
  2. 二、MacBook Pro 使用eGPU-连接eGpu篇,mac变身小台式机
  3. 常见的爬虫error以及解决方法
  4. 数学物理方法·复数/模/辐角引导题目
  5. 如何写好一份前端简历
  6. 如何选择数据拆分方法:不同数据拆分方法的优缺点及原因
  7. java 实现秒抢_Java实现抢红包算法,附完整代码(公平版和手速版)
  8. 计算机主板现状及发展趋势论文,2020年计算机主板发展趋势分析 2020-2026年全球与中国计算机主板市场深度调研与发展趋势分析...
  9. php图片生成邀请函,科学网—如何制作邀请函 - 樊晓英的博文
  10. 怎么把cad做的图分享给别人_怎么将CAD图转换