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

Java获取指定ISO年份的第一个周一

计算ISO年份首个周一的优雅实现

在Java中,借助java.time包(Java 8及以上)的内置API,就能优雅实现ISO 8601标准下的年份首个周一计算,思路和获取每月第一个周一的方式一致,无需手动处理复杂的星期偏移逻辑。

核心实现代码

利用WeekFields.ISO定义的周规则(周一为周起始,首周需包含当年至少4天),直接定位到ISO年份第一周的周一:

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

public class IsoFirstMondayUtil {
    public static LocalDate getFirstMondayOfIsoYear(int year) {
        WeekFields isoWeekRule = WeekFields.ISO;
        return LocalDate.of(year, 1, 1)
                // 切换到该ISO年份的第一周
                .with(isoWeekRule.weekOfYear(), 1)
                // 切换到该周的第一天(周一)
                .with(isoWeekRule.dayOfWeek(), 1);
    }
}

逻辑说明

  • WeekFields.ISO严格遵循ISO 8601的周定义,自动处理跨年份的情况(比如2020年的ISO首个周一实际是2019年12月30日)。
  • 代码先定位到目标年份的1月1日,再通过weekOfYear()调整到该ISO年份的第一周,最后通过dayOfWeek()定位到周一开始,全程依赖API内置规则,避免手动计算出错。

和每月首个周一实现的对比

获取每月第一个周一的常规写法是:

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

public class MonthFirstMondayUtil {
    public static LocalDate getFirstMondayOfMonth(int year, int month) {
        return LocalDate.of(year, month, 1)
                .with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
    }
}

两者思路一致:都是借助Java时间API提供的字段调整器/规则字段,直接定位到目标日期,无需手动计算偏移量,属于简洁且符合标准的实现方式。

内容的提问来源于stack exchange,提问作者Hermann.Gruber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:13:02