我们有时会遇到下面这种查询需求。需要能快速设置一个查询周期。这时我们就需要把用户的选择解析成一个个周期传给后端。本菜鸟在这里分享一段代码片段。
import moment from 'moment';
/**
* @desc 按星期解析从当前时间开始往前的数个周期
例如 parseWeek(1,2,2) 当前时间是2022/6/15 需要返回 上一个星期1到星期2和上上个星期1到星期2 [['2022/6/13 0:0:0','2022/6/14 23:59:59'],['2022/6/6 0:0:0','2022/6/7 23:59:59']]
例如 parseWeek(2,2,2) 当前时间是2022/6/15 需要返回 上一个星期2到星期2和上上个星期2到星期2 [['2022/6/14 0:0:0','2022/6/14 23:59:59'],['2022/6/7 0:0:0','2022/6/7 23:59:59']]
* @param {number} start 星期
* @param {number} end 星期
* @param {number} count 往前解析多少个周期
* @return {[][]} 返回一个周期列表
**/
export function parseWeek(start, end, count) {
let baseTime = moment().subtract(1, 'days'); //从昨天开始
const ans = [];
let endTime = null;
let max = 0; //防止因为某些情况导致程序卡死,如果有10000天内都没出结果的那也不具备使用价值
while (max++ < 10000 && ans.length < count) {
let compareWeekDay = endTime ? start : end;
let flag = false;
if (baseTime.weekday() === compareWeekDay) {
if (endTime) {
ans.push([+baseTime.startOf('days'), endTime]);
endTime = null;
} else {
flag = endTime = +baseTime.endOf('days');
}
}
if (!flag) baseTime = baseTime.subtract(1, 'days');
}
return ans;
}
/**
* @desc 按日期解析从当前时间开始往前的数个周期
例如 parseDate(1,2,2) 当前时间是2022/6/15 需要返回 上一个与上上个 1号到2号 [['2022/6/1 0:0:0','2022/6/2 23:59:59'],['2022/5/1 0:0:0','2022/5/2 23:59:59']]
例如 parseDate(2,2,2) 当前时间是2022/6/15 需要返回 上一个与上上个 2号到2号 [['2022/6/2 0:0:0','2022/6/2 23:59:59'],['2022/5/2 0:0:0','2022/5/2 23:59:59']]
例如 parseDate(-1,2,2) 当前时间是2022/6/15, 需要返回 上一个与上上个 月末到2号 [['2022/5/31 0:0:0','2022/6/2 23:59:59'],['2022/4/30 0:0:0','2022/5/2 23:59:59']]
* @param {number} start 日期 1~31代表正常一个月中的某一天 -1代表月末
* @param {number} end 日期 1~31代表正常一个月中的某一天 -1代表月末
* @param {number} count 往前解析多少个周期
* @return {[][]} 返回一个周期列表
**/
export function parseDate(start, end, count) {
let baseTime = moment().subtract(1, 'days'); //从昨天开始
const ans = [];
let endTime = null;
let max = 0; //防止因为某些情况导致程序卡死,如果有10000天内都没出结果的那也不具备使用价值
while (max++ < 10000 && ans.length < count) {
let compareDay = endTime ? start : end;
let flag = false;
if (
baseTime.date() === compareDay ||
(compareDay === -1 && isLastDay(baseTime))
) {
if (endTime) {
ans.push([+baseTime.startOf('days'), endTime]);
endTime = null;
} else {
flag = endTime = +baseTime.endOf('days');
}
}
if (!flag) baseTime = baseTime.subtract(1, 'days');
}
return ans;
}
/**
* @desc 判断一个时间是否是月末那一天
* @param {Date} time
* @return {Boolean}
**/
function isLastDay(time) {
return (
+moment(time).startOf('days') ===
+moment(time).endOf('months').startOf('days')
);
}