如何根据年份与周数获取对应的LocalDate起止日期?
根据年份和周数获取起止LocalDate日期的实现方法
在Java 8及以上版本中,推荐使用自带的java.time日期API来实现该需求,该API设计更合理且线程安全,完全不需要依赖第三方库。
核心实现思路
ISO标准中,一周从周一开始,第1周是包含当年第一个周四的那周,这正好匹配你给出的示例(2022年第49周为12月5日-12月11日)。我们可以通过WeekFields类指定周规则,结合LocalDate的方法快速定位到目标周的起止日期。
完整代码实现
import java.time.LocalDate; import java.time.temporal.WeekFields; public class WeekDateHandler { // 获取指定年份周数的起始日期(周一) public static LocalDate getWeekStart(int year, int week) { return LocalDate.of(year, 1, 1) .with(WeekFields.ISO.weekOfYear(), week) .with(WeekFields.ISO.dayOfWeek(), 1); } // 获取指定年份周数的结束日期(周日) public static LocalDate getWeekEnd(int year, int week) { // 起始日期加6天即为周日,也可以直接用dayOfWeek(7)定位 return getWeekStart(year, week).plusDays(6); } public static void main(String[] args) { // 测试示例参数 int targetYear = 2022; int targetWeek = 49; LocalDate startDate = getWeekStart(targetYear, targetWeek); LocalDate endDate = getWeekEnd(targetYear, targetWeek); System.out.printf("起始日期:%s\n结束日期:%s", startDate, endDate); // 输出: // 起始日期:2022-12-05 // 结束日期:2022-12-11 } }
关键细节说明
- 周规则自定义:如果你的业务场景中一周以周日为起始(比如美国地区),可以将
WeekFields.ISO替换为WeekFields.of(Locale.US),此时dayOfWeek(1)对应周日,dayOfWeek(7)对应周六。 - 跨年周处理:API会自动处理跨年的周数,比如2023年第1周,实际起始日期是2022年12月26日,无需额外逻辑判断。
- 参数合法性:如果传入的周数超出该年份的有效范围(比如2022年最多52周),API会自动调整到对应年份的有效周数(比如传入53周会返回2023年第1周的日期),如果需要严格校验,可以在方法中添加周数范围判断。
内容的提问来源于stack exchange,提问作者Jsef bch
相关产品推荐
相关产品推荐

