如何获取当前周之前的四周而非当月后续四周(周起止为周五至周四)
解决获取当前周(周五至周四)之前四周的问题
嘿,我帮你调整代码来实现需求——获取当前周之前的四周(周五到周四的周格式),而不是当月的后续四周。核心思路是先定位到当前周的结束日(周四),然后逐步往前推7天来获取每一周的起止日期,同时要正确配置Calendar的周起始规则,匹配你的周五到周四的周定义。
修改后的完整代码
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; public class WeekCalculator { public void getPreviousFourWeeks() { // 统一日期格式,指定Locale避免月份缩写本地化问题(比如中文环境显示"十月"而非"Oct") SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.US); Calendar cal = Calendar.getInstance(); // 关键配置:把周的起始日设为周五,匹配你的周定义(周五到周四) cal.setFirstDayOfWeek(Calendar.FRIDAY); // 定位到当前周的结束日(周四) cal.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY); // 修正错位:如果当前日期是周五到周日,上面的设置会跳到上周四,需要加7天回到本周四 int currentDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); if (currentDayOfWeek >= Calendar.FRIDAY) { cal.add(Calendar.DAY_OF_MONTH, 7); } // 循环获取当前周之前的4周(从最近的上一周开始,往回数) System.out.println("当前周之前的四周(周五至周四):"); for (int i = 0; i < 4; i++) { // 往前推7天,得到上一周的周四(周结束日) cal.add(Calendar.DAY_OF_MONTH, -7); // 克隆Calendar对象,获取该周的起始日(周五) Calendar startOfWeek = (Calendar) cal.clone(); startOfWeek.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); // 输出该周的起止日期 System.out.printf("第%d周: %s 至 %s%n", (i + 1), sdf.format(startOfWeek.getTime()), sdf.format(cal.getTime())); } } public static void main(String[] args) { new WeekCalculator().getPreviousFourWeeks(); } }
关键步骤解释
- 配置周起始规则:通过
cal.setFirstDayOfWeek(Calendar.FRIDAY)告诉Calendar你的周是从周五开始的,这是避免日期计算错位的核心。 - 定位当前周的周四:先把Calendar调整到当前周的结束日(周四),并处理了“当前日期在周五到周日时自动跳到上周四”的边界情况,确保基准日期正确。
- 循环获取前四周:每次往前推7天得到上一周的周四,再通过设置
DAY_OF_WEEK为FRIDAY得到该周的起始日,这样就能准确得到每一周的起止范围。
可选调整
如果需要包含当前周(变成当前周+之前三周),只需要把循环里的cal.add(Calendar.DAY_OF_MONTH, -7);移到循环的末尾即可,这样第一次循环会先输出当前周,再往前推。
内容的提问来源于stack exchange,提问作者Anaya Adana




