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号,原逻辑未处理这种场景。
- 重复项:原代码遍历当月每一天,当最后一天同时满足“是周日”和“是当月最后一天”时,会触发两次添加操作;另外,遍历逻辑可能导致同一周被多次处理。
修正后的代码
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
相关产品推荐
相关产品推荐

