鸿蒙开发获取本周以及无限上周,无限下周的第一天日期和最后一天日期功能的工具类

37 阅读1分钟

1.工具类代码

export interface WeekRange {
  firstDay: string;    // 周第一天(YYYY-MM-DD格式)
  lastDay: string;     // 周最后一天(YYYY-MM-DD格式)
  weekOffset: number;  // 周偏移量
}
export class SimpleWeekUtils {
  /**
   * 核心方法:获取指定偏移量的周范围
   * @param weekOffset 周偏移量:0=本周,-1=上周,1=下周,-2=上上周,2=下下周,以此类推
   * @param startOfWeek 周起始日:0=周日,1=周一
   * @returns 周范围对象(包含字符串格式的日期)
   */
  static getWeekRange(weekOffset: number, startOfWeek: number = 1): WeekRange {
    const baseDate = new Date();
    const targetDate = new Date(baseDate);

    // 应用周偏移
    targetDate.setDate(targetDate.getDate() + weekOffset * 7);

    const dayOfWeek = targetDate.getDay(); // 0=周日, 1=周一, ..., 6=周六

    let firstDayAdjustment: number;
    let lastDayAdjustment: number;

    if (startOfWeek === 1) {
      // 以周一作为一周的第一天
      const adjustedDay = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
      firstDayAdjustment = -adjustedDay;
      lastDayAdjustment = 6 - adjustedDay;
    } else {
      // 以周日作为一周的第一天(默认)
      firstDayAdjustment = -dayOfWeek;
      lastDayAdjustment = 6 - dayOfWeek;
    }

    const firstDay = new Date(targetDate);
    firstDay.setDate(targetDate.getDate() + firstDayAdjustment);

    const lastDay = new Date(targetDate);
    lastDay.setDate(targetDate.getDate() + lastDayAdjustment);

    // 返回字符串格式的日期
    return {
      firstDay: SimpleWeekUtils.formatDate(firstDay),
      lastDay: SimpleWeekUtils.formatDate(lastDay),
      weekOffset
    };
  }

  /**
   * 格式化日期为 YYYY-MM-DD
   */
  private static formatDate(date: Date): string {
    const year = date.getFullYear();
    const month = (date.getMonth() + 1).toString().padStart(2, '0');
    const day = date.getDate().toString().padStart(2, '0');
    return `${year}-${month}-${day}`;
  }
}

2.使用方式

@State weekOffset: number = 0
@State currentWeek: WeekRange = {} as WeekRange;
this.currentWeek = SimpleWeekUtils.getWeekRange(this.weekOffset);