You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何获取当前周之前的四周而非当月后续四周(周起止为周五至周四)

解决获取当前周(周五至周四)之前四周的问题

嘿,我帮你调整代码来实现需求——获取当前周之前的四周(周五到周四的周格式),而不是当月的后续四周。核心思路是先定位到当前周的结束日(周四),然后逐步往前推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

火山引擎 最新活动