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

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

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

我:不太好实现啊老板

boss:啥?别人都能做到,你咋就做不到?你这技术水平怕是有点低了把?

我:那我试试(MDZZ)

先确定后台需要什么数据格式,按照存入格式,先写个方法

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

考虑到这是一个js文件,数据分割也是固定的等分,就写一个从外部获取参数的函数吧,TimeRange(startTime,endTime)函数用来供页面调用,只传入开始时间,结束时间,不写分多少组了,因为需要的数据总量一般都是固定的,分多少组也是固定的,哪里需要直接来js改就好了

  function TimeRange(startTime, endTime) { //传入开始时间var startTime 传入结束时间var endTime 传入格式xxxx-xx-xx 年月日
var amount = 100; //定义分多少组
var startTimes = startTime + " 00:00:00"; //日期添加时分秒 开始日期
var endTimes = endTime + " 23:59:59"; //日期添加时分秒 结束日期

判断一波

 if(endTimes <= startTimes) {
alert('结束日期必须大于开始日期!');
return -1;
} if(dataDiff > 15) {
alert('单次查询日期不超过两周,请重新选择!');
return -2;
}

既然平均分,那就得知道时间间隔,计算时间间隔,写个方法直接调用

 //计算天数差的函数,通用
function DateDiff(sDate1, sDate2) { //sDate1和sDate2是2006-12-18格式
var aDate, oDate1, oDate2, iDays
aDate = sDate1.split("-")
oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0]) //转换为12-18-2006格式
aDate = sDate2.split("-")
oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 / 24) //把相差的毫秒数转换为天数
return iDays
}

整理了一下逻辑,伪代码如下

     //计算时间段总时间,分割后每段时间间隔,单位(秒)
var timeRange;//存储计算出的时间段
var timeAll ; //总时间间隔
var timeGap ; //分割后时间间隔
var slidingTime = 0; //循环开始条件
var momentTime_front; //时间段前一个值
var momentTime_rear;//时间段后一个值
for(slidingTime; slidingTime < timeAll; slidingTime += timeGap) {
momentTime_front = 计算出的时间前半部分
momentTime_rear = 计算出的时间后半部分
timeRange.push(new range(momentTime_front, momentTime_rear));//将计算后的小段的开始时间和结束时间组合存入timeRange
}
return timeRange;
}

实现后的TimeRange()方法如下:

 function TimeRange(startTime, endTime) { //传入开始时间var startTime 传入结束时间var endTime
var amount = 100; //定义分多少组
var timeRange = new Array(); //return数组初始化
var dataDiff = DateDiff(startTime, endTime); //计算两个日期相差天数
var startTimes = startTime + " 00:00:00"; //日期添加时分秒 开始日期
var endTimes = endTime + " 23:59:59"; //日期添加时分秒 结束日期 if(endTimes <= startTimes) {
alert('结束日期必须大于开始日期!');
return -1;
} if(dataDiff > 15) {
alert('单次查询日期不超过两周,请重新选择!');
return -2;
}
if(1) {
//计算时间段总时间,分割后每段时间间隔,单位(秒)
var timeAll = (dataDiff + 1) * 24 * 3600; //总时间间隔
var timeGap = timeAll / amount; //分割后时间间隔
var slidingTime = 0; //循环开始
var momentTime_front;
var momentTime_rear;
for(slidingTime; slidingTime < timeAll; slidingTime += timeGap) {
momentTime_front = addDatetime(startTimes, slidingTime)
momentTime_rear = addDatetime(startTimes, (slidingTime + timeGap - 1))
timeRange.push(new range(momentTime_front, momentTime_rear));
}
return timeRange;
}
}

接下来的问题就是如何计算 momentTime_front 和 momentTime_rear 了

我的思路是将开始时间加上秒数转换后的日时分秒等再相加,直接添加的语句或者方法没找到,那咋办?还把我难住了?找不到算了,技不如人,不如自己写一个方法,直接计算两个字符串类型的时间格式相加,哼╭(╯^╰)╮

先想想怎么写,需要现将字符串转换成字符串类型的数组,将年月日时分秒都分开才能逐个击破,分开后的数组都是字符串类型,没法进行加减运算,强转!先写个将日期类型转换为整型数组的方法

 //传入'1970-01-01 00:00:00' 将其分成可计算的整形数组[1970,1,1,0,0,0]
function getArray(dataTime) {
dataTime = dataTime.replace(/ /, "-")
var timesArray = dataTime.split("-");
var timeArray = timesArray[3].split(":");
timesArray[0] = parseInt(timesArray[0]);
timesArray[1] = parseInt(timesArray[1]);
timesArray[2] = parseInt(timesArray[2]);
timesArray[3] = parseInt(timeArray[0]);
timesArray[4] = parseInt(timeArray[1]);
timesArray[5] = parseInt(timeArray[2]);
return timesArray;
}

ok,能计算了,但是增加的时间是秒,还得把秒转换成年月日时分秒格式

 //将秒转换为日期格式(最高到天)
function getDatetime(s) {
var dataTime = new Array;
//存入 秒
dataTime[5] = parseInt((s / 1) % 60);
//存入 分
dataTime[4] = parseInt((s / 60) % 60);
//存入 时
dataTime[3] = parseInt((s / 60 / 60) % 24);
//存入 日
dataTime[2] = parseInt(s / 60 / 60 / 24);
//存入 月
dataTime[1] = parseInt(0);
//存入 年
dataTime[0] = parseInt(0);
return dataTime;
}

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

 //获取当月天数
function getMonthDay(years, month) {
switch(month) {
case "2":
if(years % 4 == 0 && years %100 !=0) {
return "29";
}
if(years % 4 == 0 &&years % 100 == 0 && years % 400 == 0) {
return "29";
} else {
return "28";
}
return "28";
case "4":
return "30";
case "6":
return "30";
case "9":
return "30";
case "11":
return "30";
default:
return "31";
}
}

因为生成的结果是个数组,我们认识,但是计算机傻呀,还要在转换为输入的日期格式的字符串,逆向的过程

 //将datetime日期数组转换为string类型
function dataTimetoString(dateTime) {
for(i = 0; i <= 5; i++) {
dateTime[i] = dateTime[i].toString();
}
var dataTime_Str = "";
//添加 年
dataTime_Str += dateTime[0] + "-";
//添加 月
if(dateTime[1].length == 2) {
dataTime_Str += dateTime[1] + "-";
} else {
dataTime_Str += "0" + dateTime[1] + "-";
}
//添加 日
if(dateTime[2].length == 2) {
dataTime_Str += dateTime[2] + " ";
} else {
dataTime_Str += "0" + dateTime[2] + " ";
}
//添加 时
if(dateTime[3].length == 2) {
dataTime_Str += dateTime[3] + ":";
} else {
dataTime_Str += "0" + dateTime[3] + ":";
}
//添加 分
if(dateTime[4].length == 2) {
dataTime_Str += dateTime[4] + ":";
} else {
dataTime_Str += "0" + dateTime[4] + ":";
}
//添加 秒
if(dateTime[5].length == 2) {
dataTime_Str += dateTime[5];
} else {
dataTime_Str += "0" + dateTime[5];
}
return dataTime_Str;
}

好啦,准备工作全部完成,开始我们核心的增加的计算啦,各种小细节问题,想起来就头疼,好在解决了,不细说啦,Showtime!       ヾ(≧O≦)〃嗷~ヾ

 //将两个日期相加后的结果返回
function addDatetime(dt, s) {
var dateTime = new Array; //创建数组
var addDatetime = new Array; //创建数组
var dataTimeStr = new Array; //创建数组
dateTime = getArray(dt); //将字符串类型的时间转换为整形数组
addDatetime = getDatetime(s); //将间隔时间秒转换为日期格式的整形数组
var count = 0;//存储进位 dataTimeStr[5] = (dateTime[5] + addDatetime[5] + count) % 60; //秒
((dateTime[5] + addDatetime[5] + count) > 59) ? count = 1: count = 0; dataTimeStr[4] = (dateTime[4] + addDatetime[4] + count) % 60; //分
((dateTime[4] + addDatetime[4] + count) > 59) ? count = 1: count = 0; dataTimeStr[3] = (dateTime[3] + addDatetime[3] + count) % 24; //时
((dateTime[3] + addDatetime[3] + count) > 23) ? count = 1: count = 0; var m = getMonthDay(dateTime[0].toString(), dateTime[1].toString());
dataTimeStr[2] = (dateTime[2] + addDatetime[2] + count) % m; //日
((dateTime[2] + addDatetime[2] + count) > m) ? count = 1: count = 0;
if(dataTimeStr[2] == 0) {
dataTimeStr[2] = (dateTime[2] + addDatetime[2] + count) % (m + 1);
count = 0;
}
dataTimeStr[1] = (dateTime[1] + addDatetime[1] + count) % 12; //月
((dateTime[1] + addDatetime[1] + count) > 12) ? count = 1: count = 0;
if(dataTimeStr[1] == 0) {
dataTimeStr[1] = (dateTime[1] + addDatetime[1] + count) % 13;
count = 0;
} dataTimeStr[0] = (dateTime[0] + addDatetime[0] + count) / 1; //年 var dataTime_str = dataTimetoString(dataTimeStr); //将日期格式的数组转换为字符串
return dataTime_str;
}

如果有错误,麻烦评论区告诉我一声,万分感谢,觉得有帮助的点个赞谢谢,撒油那啦...ヾ( ̄▽ ̄)Bye~Bye~

做了修改,新的链接贴上来,超简单,感谢评论

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

js 将一大段时间均分为很多个小时间段的更多相关文章

  1. js间隔一段时间打印数据库中的值

    https://blog.csdn.net/qq_33599109/article/details/78417474

  2. JS 获取一段时间内的工作时长小时数

    本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ...

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

    微信小程序开发文档-组件-swiper后面追加的新闻如上图所示: 如果在bindchange事件给swiper的current属性对应的值{{current}}赋值,就会造成抖动现象. bindcha ...

  4. 一段时间没上来了,看到有很多网友对OWA感兴趣,因为所在公司发展方向的原因,没有太多时间继续深入研究OWA,敬请见谅

    一段时间没上来了,看到有很多网友对OWA感兴趣,因为所在公司发展方向的原因,没有太多时间继续深入研究OWA,敬请见谅

  5. js setInterval每隔一段时间执行一次

    js setInterval每隔一段时间执行一次setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式.setInterval() 方法会不停地调用函数,直到 clearI ...

  6. js实现类似页面广告一段时间自动打开一段时间自动关闭的功能

    js实现类似页面广告一段时间自动打开一段时间自动关闭的功能 一.总结 Window 对象的 open()方法:window.open('测试页面.html','news','height=300,wi ...

  7. 专访黄勇:Java在未来的很长一段时间仍是主流(把老板当情人,把同事当小孩,把客户当病人)

    url:http://www.csdn.net/article/2015-09-06/2825621 2015-09-06 13:18 摘要:本文采访了现任阿里巴巴公司系统架构师黄勇,从事近十年的Ja ...

  8. Win8.1开机黑屏一段时间才能登录

    最近发现开机后有一段时间黑屏过后才能进人登录界面,并且时间越来越长,网上查询了很多方法都没有效果,只能自己找了. 网上有一种方法提到用msconfig诊断判断或者安全启动来查看是否有黑屏,于是试了一下 ...

  9. 这段时间对c#和java的感受

    这段时间对c#和java的感受 虽然很多书上说语法相似,但实际这是一个接近于门外汉的看法 真正的不同是 c#对更贴近系统API,      而java倡导跨平台 因而c#语法关键字更多,更细, 而ja ...

随机推荐

  1. jQuery的less和scss之less的基本介绍(一)

    简单的整理了一下less的基本用法,希望对大家有所帮助ㅎㅎ 一.less基础语法 1.声明变量:@变量名:变量值 使用变量:@变量名 例如 @color : #ff0000; @length : 10 ...

  2. 对#ifndef的理解

    由于对#ifndef的用法不太理解,在询问了老师#ifndef的含义以及查找资料后,对#ifndef总结了以下几点: <1> #ifndef是宏定义的一种,是三种预处理功能(宏定义,文件包 ...

  3. 201521123038 《Java程序设计》 第九周学习总结

    201521123038 <Java程序设计> 第九周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 ...

  4. 201521123049 《JAVA程序设计》 第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  5. 201521123012 《Java程序设计》第十三周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec ...

  6. Junit4学习(四)Junit4常用注解

    一,背景知识: 由前面的知识可以知道: /*     * @Test:将一个普通方法修饰为一个测试方法     *   @Test(exception=XXX.class)     *   @Test ...

  7. “.Net 社区大会”(dotnetConf) 2017 Day 1 Keynote: .NET Everywhere

    8月份已经发布了.NET Core 2.0, 大会Keynote 一开始花了大量的篇幅回顾.NET Core 2.0的发布,社区的参与度已经非常高.大会的主题是.NET 无处不在: NET Core ...

  8. Oracle总结第三篇【PLSQL】

    PLSQL介绍 PLSQL是Oracle对SQL99的一种扩展,基本每一种数据库都会对SQL进行扩展,Oracle对SQL的扩展就叫做PLSQL- SQL99是什么 (1)是操作所有关系型数据库的规则 ...

  9. Activiti-01

    1, Activiti官网:http://www.activiti.org/  主页可以看到jar包的下载. 2, 进入http://www.activiti.org/userguide/index. ...

  10. Linux中组 与 用户的管理

    在linux中建立组的指令是 groupadd 组名 相应的,删除组的指令: groupdel 组名 查看自己用户的组: groups 一个用户可以在多个组里面,用这个命令可以将用户添加到组: add ...