You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中获取当前月份仅含当月日期的周范围(适配MPAndroidChart)

修正MPAndroidChart X轴周范围标签生成代码

需求说明

需要在MPAndroidChart的X轴显示仅包含当月日期的周范围标签,例如2月需展示1-4、5-11、12-18、19-25、26-28这类格式(第一周即使包含上月日期,也只保留当月部分)。

现有代码

public List<String> getWeeksInCurrentMonth() {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.DAY_OF_MONTH, 1);
    int month = cal.get(Calendar.MONTH);

    List<String> weekRanges = new ArrayList<>();

    while (cal.get(Calendar.MONTH) == month) {
        int week = cal.get(Calendar.WEEK_OF_MONTH);
        int year = cal.get(Calendar.YEAR);
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

        if (dayOfWeek == Calendar.SUNDAY || cal.getActualMaximum(Calendar.DAY_OF_MONTH) == cal.get(Calendar.DAY_OF_MONTH)) {
            int startDay = cal.get(Calendar.DAY_OF_MONTH) - (dayOfWeek - 1);
            int endDay = cal.get(Calendar.DAY_OF_MONTH) + (7 - dayOfWeek);

            if (endDay > cal.getActualMaximum(Calendar.DAY_OF_MONTH)) {
                endDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
            }

            if (startDay <= endDay && startDay <= cal.getActualMaximum(Calendar.DAY_OF_MONTH)) {
                weekRanges.add(String.format("%d-%d", startDay, endDay));
            }
        }

        cal.add(Calendar.DAY_OF_MONTH, 1);
    }

    System.out.println(weekRanges);
    return weekRanges;
}

运行问题

在美国地区运行后,输出为:

[5-11, 12-18, 19-25, 26-28, 26-28]

存在两个问题:

  • 第一周(如1-4)缺失
  • 出现重复的周范围项

问题分析

  1. 第一周缺失:原代码仅在周日或当月最后一天才生成周范围,但当月第一天若不是周日,第一周的起始是当月1号,原逻辑未处理这种场景。
  2. 重复项:原代码遍历当月每一天,当最后一天同时满足“是周日”和“是当月最后一天”时,会触发两次添加操作;另外,遍历逻辑可能导致同一周被多次处理。

修正后的代码

public List<String> getWeeksInCurrentMonth() {
    Calendar cal = Calendar.getInstance();
    // 定位到当月第一天
    cal.set(Calendar.DAY_OF_MONTH, 1);
    int currentMonth = cal.get(Calendar.MONTH);
    int maxDayOfMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    List<String> weekRanges = new ArrayList<>();

    while (cal.get(Calendar.MONTH) == currentMonth) {
        // 本周起始日:不能早于当月1号
        int startDay = Math.max(cal.get(Calendar.DAY_OF_MONTH), 1);
        // 计算本周的结束日(加6天,覆盖整周)
        Calendar weekEndCal = (Calendar) cal.clone();
        weekEndCal.add(Calendar.DAY_OF_MONTH, 6);
        // 本周结束日:不能晚于当月最后一天
        int endDay = Math.min(weekEndCal.get(Calendar.DAY_OF_MONTH), maxDayOfMonth);

        weekRanges.add(String.format("%d-%d", startDay, endDay));

        // 跳到下一周的第一天
        cal.add(Calendar.DAY_OF_MONTH, 7);
    }

    // 兜底处理:如果最后一周的结束日没覆盖到当月最后一天
    if (!weekRanges.isEmpty()) {
        String lastRange = weekRanges.get(weekRanges.size() - 1);
        int lastEnd = Integer.parseInt(lastRange.split("-")[1]);
        if (lastEnd < maxDayOfMonth) {
            weekRanges.add(String.format("%d-%d", lastEnd + 1, maxDayOfMonth));
        }
    } else {
        // 极端情况:当月只有1天
        weekRanges.add("1-1");
    }

    System.out.println(weekRanges);
    return weekRanges;
}

关键修正点

  • 改为按周步进而非遍历每天,避免重复处理同一周
  • 强制每周起始日不早于当月1号,确保第一周从1号开始
  • 强制每周结束日不晚于当月最后一天,避免超出当月范围
  • 添加兜底逻辑,处理当月最后一天未被覆盖的极端情况

内容的提问来源于stack exchange,提问作者Mac_Play

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:25:17