在开发公司管理后台系统时,遇到了需要根据不同的时间段如“近一年、近半年、近三月、近一月、近一周”来获取并展示不同图表数据的需求,很是繁琐,项目开发周期又非常的短,自己想了一下,虽然有思路,但一时半会儿要写出来还是比较费时的,所以就索性上网找一个现成的轮子吧,还好已有大神写过同样的效果的,但离我实际的需求还是有点远,现在先参考大神的代码来做一个笔记吧:
//格式化时间
function formatTime(param) {
let y = param.getFullYear();
let m = param.getMonth() + 1;
let d = param.getDate();
m = m < 10 ? ("0" + m) : m;
d = d < 10 ? ("0" + d) : d;
return y + "-" + m + "-" + d + " ";
}
/**
* 以当前时间为基础,便捷获取时间(最近2天,最近1周,最近2周,最近1月,最近2月,最近半年,最近一年,本周,本月,本年)
* @param { string } code
* @returns { Object }
*/
function getDate(code) {
const date = new Date();
let endTime = formatTime(date);
let date1 = Date.parse(date);
let start = '';
let end = '';
let oneDay = 1000 * 3600 * 24;
switch (code) {
//今天
case 'today':
start = new Date();
break;
//最近2天
case 'lastTwoDay':
start = date1 - oneDay * 2;
break;
//最近1周
case 'lastOneWeek':
start = date1 - oneDay * 7;
break;
//最近2周
case 'lastTwoWeek':
start = date1 - oneDay * 14;
break;
//最近1月
case 'lastOneMonth':
start = new Date();
start.setMonth(start.getMonth() - 1)
break;
//最近2月
case 'lastTwoMonth':
start = new Date();
start.setMonth(start.getMonth() - 2)
break;
//最近3月
case 'lastThreeMonth':
start = new Date();
start.setMonth(start.getMonth() - 3)
break;
//最近半年
case 'lastHalfYear':
start = date1 - oneDay * 183;
break;
//最近一年
case 'lastOneYear':
start = new Date();
start.setYear(start.getFullYear() - 1)
break;
//本周
case 'thisWeek':
let a = 6 - date.getDay();
start = new Date(date1 - oneDay * a).setHours(0, 0, 0, 0);
end = new Date(date1 + oneDay * (1 + date.getDay())).setHours(24, 0, 0, 0)
break;
//本月
case 'thisMonth':
start = new Date();
start.setHours(0, 0, 0, 0)
start.setMonth(start.getMonth(), 1)
end = new Date(start)
end.setHours(0, 0, 0, 0)
end.setMonth(start.getMonth() + 1, 1)
break;
//本年
case 'thisYear':
start = new Date();
start.setHours(0, 0, 0, 0)
start.setMonth(0, 1)
start.setYear(start.getFullYear())
end = new Date(start)
end.setHours(0, 0, 0, 0)
end.setMonth(start.getMonth(), 1)
end.setYear(start.getFullYear() + 1)
break;
}
return {
startTime: formatTime(new Date(start)),
endTime: end ? formatTime(new Date(end)) : endTime,
}
}
使用方法很简单,输出最近一周:console.log(getDate('lastOneWeek'))。
这种方法出来的效果如最近一周:{startTime: "2019-09-22 ", endTime: "2019-09-29 "},这样的处理适合那种只需要一个开始日期和结束日期的接口,而根据我们的实际需求,需要的是类似这样的数据:
最近一周:["2019-09-22", "2019-09-23", "2019-09-24", "2019-09-25", "2019-09-26", "2019-09-27", "2019-09-28", "2019-09-29"]或者最近一月:["2019-08-29", "2019-08-30", "2019-08-31", "2019-09-01", ..., "2019-09-29"]。
因为这个需求是用在类似折线图表这样的X轴做展示用的,如图:
是不是很繁琐?让前端处理起来,相当麻烦,写后台接口的同事说你们前端别处理了,太麻烦了,这个日期我们来返给你们。真是良心啊!!!