分享两个业务中的实用方法:输入【从周一到周二,返回当前时间往前两个周期】,输入【从一号到十八号,返回当前时间往前两个周期】

106 阅读3分钟

我们有时会遇到下面这种查询需求。需要能快速设置一个查询周期。这时我们就需要把用户的选择解析成一个个周期传给后端。本菜鸟在这里分享一段代码片段。

image.png

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')
  );
}