日期时间范围方法

需求:当前日期或指定日期所在的整年、整季度、整月;当前日期或指定日期所在的上一年、上个季度、上个月。

注:这里的整月不是固定的30天,是根据下个月的第一天倒推的,年份季度同理

最简单的获取当前日期或指定日期整月

/* eslint-disable eqeqeq */
// 获取当前月份的第一天、最后一天
export function getMonthDate(params) {
  const date = params ? new Date(params) : new Date();
  const getYear = date.getFullYear(); // 当前年
  const getMonth = date.getMonth(); // 当前月
  const firstDay = new Date(getYear, getMonth, 1); // 当前月份的第一天

  let nextMonth = getMonth + 1; // 下一个月
  let nextYear = getYear; // 下一年
  if (nextMonth > 12) {
    nextMonth -= 12;
    nextYear += 1;
  }
  const nextDay = new Date(nextYear, nextMonth, 1); // 获取下个月的第一天
  const lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前月份的最后一天
  return [firstDay, lastDay];
}



// 获取当前年份的第一天、最后一天
export function getYearDate(params) {
  const date = params ? new Date(params) : new Date();
  const getYear = date.getFullYear(); // 当前年
  const firstDay = new Date(getYear, 0, 1); // 当前年份的第一天
  const nextDay = new Date(getYear + 1, 0, 1); // 获取下一年的第一天
  const lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前年份的最后一天
  return [firstDay, lastDay];
}

上面的方法都是一个一个单独的,而且如果年、季度、月都要的话,好多的重复代码,所以我又给搞了一个整合版本,哈,只需要传入对应需要获取的日期类型就可以了


/***** 获取当前日期所在的日期范围,整月、整季度、 整年,整半年
 ****** 传入参数:  date,type
 ****** 参数说明:
 ****** ******* date  需要获取的时间日期,默认当前日期
 ****** ******* type  month 月份
 ****** *******       quarter 季度
 ****** *******       half 半年
 ****** *******       year 年份   默认
 *****/
export function getDateRange(date, type) {
  const newDate = date ? new Date(date) : new Date(); // 格式化传入日期 或者 获取当前日期
  const range = type || 'year'; // 重置范围类型
  const newYear = newDate.getFullYear(); // 获取传入日期年份 或者 当前年份
  const newMonth = newDate.getMonth(); // 获取传入月份 或者 当前月份
  let firstDay = new Date(); // 根据类型,最终赋值,第一天当年、当月、当季度)
  let lastDay = new Date(); // 根据类型,最终赋值,最后一天(当年、当月、当季度)

  // 整月   // 季度   // 半年
  if (range !== 'year') {
    let arr = [];
    if (range === 'month') arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
    if (range === 'quarter')
      arr = [
        [0, 1, 2],
        [3, 4, 5],
        [6, 7, 8],
        [9, 10, 11],
      ];
    if (range === 'half')
      arr = [
        [0, 1, 2, 3, 4, 5],
        [6, 7, 8, 9, 10, 11],
      ];
    arr.forEach(item => {
      if (range === 'month' ? item === newMonth : item.indexOf(newMonth) > -1) {
        let nextMonth =
          range === 'month'
            ? item + 1
            : range === 'quarter'
            ? item[2] + 1
            : item[item.length - 1] + 1; // 下个月
        let firstMonth = range === 'month' ? item : item[0]; // 当前月/当前时间范围首月
        let nextYear = newYear; // 下一年
        if (nextMonth > 12) {
          // 判断是否是下一年
          nextMonth -= 12;
          nextYear += 1;
        }
        const nextDay = new Date(nextYear, nextMonth, 1); // 获取下个月的第一天
        lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前月份的最后一天
        firstDay = new Date(newYear, firstMonth, 1); // 当前日期范围第一天
      }
    });
  }

  // 整年
  if (range === 'year') {
    const nextDay = new Date(newYear + 1, 0, 1); // 获取下一年的第一天
    lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前年份的最后一天
    firstDay = new Date(newYear, 0, 1); // 当前年份的第一天
  }

  return [firstDay, lastDay]; // 最终返回的时间范围
}

/*****
 ***** 从当前日期开始倒推 一月、一季度、半年、一年
 ***** 参数:date,type
 ****** 参数说明:
 ****** ******* date  需要获取的时间日期,默认当前日期
 ****** ******* type  month 月份
 ****** *******       quarter 季度
 ****** *******       half 半年
 ****** *******       year 年份   默认
 */
export function getDateLastRange(date, type) {
  const newDate = date ? new Date(date) : new Date(); // 格式化传入日期 或者 获取当前日期
  const range = type || 'year'; // 重置范围类型
  const newYear = newDate.getFullYear(); // 获取年
  const newMonth = newDate.getMonth(); // 获取月
  const newDay = newDate.getDate(); // 获取日

  // console.log(newDate, newDay);

  let firstDay = new Date(); // 根据类型,最终赋值,第一天当年、当月、当季度)
  let lastDay = new Date(); // 根据类型,最终赋值,最后一天(当年、当月、当季度)

  // 整月   // 季度   // 半年
  if (range !== 'year') {
    let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
    arr.forEach(item => {
      if (item === newMonth) {
        let last =
          range === 'month'
            ? item - 1
            : range === 'quarter'
            ? item - 3
            : range === 'quarter'
            ? item - 6
            : item; // 上个月
        let lastYear = last > -1 ? newYear : newYear - 1; // 上一年
        const lastMonth = last > -1 ? arr[last] : arr[arr.length + last];

        firstDay = new Date(lastYear, lastMonth, newDay); // 当前日期范围第一天
        lastDay = new Date(new Date().getTime() - 1000 * 60 * 60 * 24); // 获取当前日期范围的最后一天
      }
    });
  }

  // 整年
  if (range === 'year') {
    lastDay = newDate; // 今天
    firstDay = new Date(newYear - 1, newMonth, newDay); // 上一年的今天
  }

  return [firstDay, lastDay]; // 最终返回的时间范围
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值