zouyu
2026-05-07 b0d4df5f39525ae7fe252e8ee65d85fd71dca721
src/utils/date.js
@@ -1,3 +1,4 @@
import dayjs from 'dayjs';
/**
 * 获取年月日
 */
@@ -51,4 +52,125 @@
    return format
  }
  return ''
}
}
/**
 * 获取年月日  26号+1
 * @param date
 * @returns {string}
 */
export function getYearAndMonthAndDaysZTNS(date = new Date()) {
  let year = date.getFullYear();
  let month = date.getMonth();
  let days = date.getDate();
  // 判断是否是26号
  if (days === 26) {
    month++;
    if (month > 11) {
      month = 0;
      year++;
    }
  }
  month += 1;
  month = month < 10 ? '0' + month + '-' : month + '-';
  year = year + '-';
  days = days < 10 ? '0' + days : days;
  return (year + month + days);
}
/**
 * 获取时间范围:26号-25号
 * 初始化默认日期范围:近一个月(当前日期 - 30天 至 当前日期)
 * @param format
 * @returns {*[]}
 */
export function getTimeRange(format = 'YYYY-MM-DD HH:mm:ss') {
  // 获取当前时间
  const now = dayjs();
  // 获取当前日期的「日」(1-31)
  const currentDate = now.date();
  let startTime, endTime;
  // 核心逻辑:判断当前日期是否大于25号
  if (currentDate > 25) {
    // ✅ 情况1:当前日>25 → 当月26号 ~ 次月25号
    startTime = now.startOf('month').add(25, 'day'); // 当月1号 +25天 = 26号
    endTime = startTime.add(1, 'month').date(25).hour(23)
      .minute(59)
      .second(59);     // 次月25号(dayjs自动处理跨年)
  } else {
    // ✅ 情况2:当前日≤25 → 上月26号 ~ 当月25号
    startTime = now.subtract(1, 'month').startOf('month').add(25, 'day'); // 上月26号
    endTime = now.date(25).hour(23)
      .minute(59)
      .second(59); // 当月25号
  }
  // 返回格式化后的时间数组
  return [startTime.format(format), endTime.format(format)];
}
/**
 * 获取班次月份
 * @returns {*}
 */
export function getWorkMonth(){
  // 获取当前时间
  const now = dayjs();
  // 获取当前日期的「日」(1-31)
  const currentDate = now.date();
  let workMonth;
  // 核心逻辑:判断当前日期是否大于25号
  if (currentDate > 25) {
    workMonth = now.add(1, 'month')
  }else{
    workMonth = now
  }
  return workMonth
}
/**
 * 判断时间区间是否超过 1 个自然月
 * @param {string} startTime - 开始时间 yyyy-MM-dd HH:mm:ss
 * @param {string} endTime - 结束时间 yyyy-MM-dd HH:mm:ss
 * @returns {boolean} true=超过一个月,false=未超过
 */
export function isOverOneMonth(startTime, endTime) {
  // 1. 解析为日期对象
  const start = new Date(startTime);
  const end = new Date(endTime);
  // 2. 校验日期合法性
  if (isNaN(start.getTime()) || isNaN(end.getTime())) {
    throw new Error("时间格式错误,请使用 yyyy-MM-dd HH:mm:ss 格式");
  }
  // 3. 如果结束时间早于开始时间,直接返回false
  if (end < start) return false;
  // 4. 计算年份差、月份差
  const startYear = start.getFullYear();
  const startMonth = start.getMonth();
  const startDay = start.getDate();
  const startRest = start.getTime() - new Date(startYear, startMonth, startDay).getTime(); // 时分秒毫秒
  const endYear = end.getFullYear();
  const endMonth = end.getMonth();
  const endDay = end.getDate();
  const endRest = end.getTime() - new Date(endYear, endMonth, endDay).getTime();
  // 总月份差值
  const monthDiff = (endYear - startYear) * 12 + (endMonth - startMonth);
  // 5. 判断逻辑
  if (monthDiff > 1) {
    return true; // 月份差>1 → 超过
  } else if (monthDiff === 1) {
    // 月份差=1 → 比较 日+时分秒,超过则判定超时
    return endDay > startDay || (endDay === startDay && endRest > startRest);
  } else {
    return false; // 月份差<1 → 未超过
  }
}