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

Java中获取指定年份对应周周一日期的问题及优化方案咨询

问题原因

你之前的代码误用了weekOfWeekBasedYear()方法,它是基于周基准年(Week-based Year)的周数统计,而非公历年的周数。周基准年的第一周可能跨公历年(比如2023年1月1日属于2022年的周基准年第52周),所以从2023年1月1日出发调整到第49周,实际是在2022的周基准年范围内查找,结果自然不符合你的预期。

更优解决方案(无需使用Calendar)

直接用Java 8+的java.time API就能解决,以下两种简洁实现都能匹配你的需求(每周从周一开始,公历年第1周的周一为当年第一个周一):

方式一:基于TemporalAdjusters直接计算

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

public static LocalDate getMondayOfWeek(int year, int weekNumber) {
    // 获取当年第一天,定位到当年的第一个周一
    LocalDate firstMonday = LocalDate.of(year, 1, 1)
            .with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
    // 第N周的周一 = 第一个周一 + (N-1)周的间隔
    return firstMonday.plusWeeks(weekNumber - 1);
}

方式二:自定义WeekFields规则

如果需要灵活调整周规则(比如要求第一周至少包含当年4天),可以通过WeekFields自定义规则:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.WeekFields;

public static LocalDate getMondayOfWeek(int year, int weekNumber) {
    // 自定义规则:周一为一周第一天,公历年第1周至少包含当年1天(即第一个周一为第1周起点)
    WeekFields customWeek = WeekFields.of(DayOfWeek.MONDAY, 1);
    return LocalDate.of(year, 1, 1)
            // 调整到公历年的第weekNumber周
            .with(customWeek.weekOfYear(), weekNumber)
            // 调整到该周的第一天(周一)
            .with(customWeek.dayOfWeek(), 1);
}
验证结果

调用getMondayOfWeek(2023, 49),两种方式都会返回2023-12-04,完全符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:15:31