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
相关产品推荐
相关产品推荐

