如何通过Java的LocalDate.minusYears()方法快速获取特定年份的日期所在周的详细信息?
- 内容介绍
- 文章标签
- 相关推荐
本文共计655个文字,预计阅读时间需要3分钟。
相关专题:
在 java 中,localdate.minusyears() 本身不直接提供周信息(如星期几、第几周等),但它可以快速回退到历史年份的**同月同日**,之后再结合 getdayofweek()、get(isofields.week_of_week_year) 等方法获取完整周信息。关键在于:先用 minusyears() 定位日期,再用其他 localdate 方法提取周相关字段。
获取历史年份同日的星期几
例如想知道 2020 年 10 月 15 日是星期几:
// 当前日期(示例)
LocalDate today = LocalDate.of(2024, 10, 15);
LocalDate target = today.minusYears(4); // → 2020-10-15
DayOfWeek dow = target.getDayOfWeek(); // → THURSDAY
// 输出:2020-10-15 是星期四
计算历史日期在当年的第几周(ISO 周)
ISO 周定义:每周从周一算起,第 1 周是包含该年第一个周四的那周。使用 IsoFields.WEEK_OF_WEEK_YEAR:
- int weekOfYear = target.get(IsoFields.WEEK_OF_WEEK_YEAR); // 2020-10-15 → 第 42 周
- 注意:不要用
ChronoField.ALIGNED_WEEK_OF_YEAR,它按自然月切分,不符合 ISO 标准 - 若需获取该周的起止日期(周一至周日),可用:
target.with(DayOfWeek.MONDAY)和target.with(DayOfWeek.SUNDAY)
处理闰年 2 月 29 日的特殊情况
minusYears() 对 2 月 29 日有明确行为:若目标年份不是闰年,则自动回退到 2 月 28 日。
// 2024-02-29 → minusYears(1) → 2023-02-28(2023 不是闰年)
LocalDate leapDay = LocalDate.of(2024, 2, 29);
LocalDate prev = leapDay.minusYears(1); // 2023-02-28
System.out.println(prev + " 是 " + prev.getDayOfWeek()); // 2023-02-28 是星期二
如需严格保持“每年 2 月最后一天”,可改用 with(TemporalAdjusters.lastDayOfMonth()) 配合 minusYears()。
立即学习“Java免费学习笔记(深入)”;
批量计算多个历史年份的周信息
结合循环或 Stream,可高效生成多年对比数据:
- 用
IntStream.rangeClosed(1, 5)表示过去 1–5 年 - 对每个偏移量调用
today.minusYears(yearsAgo) - 封装为 record 或 Map,包含日期、星期、ISO 周、所在周周一等字段
- 示例字段组合:
Map.of("date", d, "dow", d.getDayOfWeek(), "week", d.get(IsoFields.WEEK_OF_WEEK_YEAR))
本文共计655个文字,预计阅读时间需要3分钟。
相关专题:
在 java 中,localdate.minusyears() 本身不直接提供周信息(如星期几、第几周等),但它可以快速回退到历史年份的**同月同日**,之后再结合 getdayofweek()、get(isofields.week_of_week_year) 等方法获取完整周信息。关键在于:先用 minusyears() 定位日期,再用其他 localdate 方法提取周相关字段。
获取历史年份同日的星期几
例如想知道 2020 年 10 月 15 日是星期几:
// 当前日期(示例)
LocalDate today = LocalDate.of(2024, 10, 15);
LocalDate target = today.minusYears(4); // → 2020-10-15
DayOfWeek dow = target.getDayOfWeek(); // → THURSDAY
// 输出:2020-10-15 是星期四
计算历史日期在当年的第几周(ISO 周)
ISO 周定义:每周从周一算起,第 1 周是包含该年第一个周四的那周。使用 IsoFields.WEEK_OF_WEEK_YEAR:
- int weekOfYear = target.get(IsoFields.WEEK_OF_WEEK_YEAR); // 2020-10-15 → 第 42 周
- 注意:不要用
ChronoField.ALIGNED_WEEK_OF_YEAR,它按自然月切分,不符合 ISO 标准 - 若需获取该周的起止日期(周一至周日),可用:
target.with(DayOfWeek.MONDAY)和target.with(DayOfWeek.SUNDAY)
处理闰年 2 月 29 日的特殊情况
minusYears() 对 2 月 29 日有明确行为:若目标年份不是闰年,则自动回退到 2 月 28 日。
// 2024-02-29 → minusYears(1) → 2023-02-28(2023 不是闰年)
LocalDate leapDay = LocalDate.of(2024, 2, 29);
LocalDate prev = leapDay.minusYears(1); // 2023-02-28
System.out.println(prev + " 是 " + prev.getDayOfWeek()); // 2023-02-28 是星期二
如需严格保持“每年 2 月最后一天”,可改用 with(TemporalAdjusters.lastDayOfMonth()) 配合 minusYears()。
立即学习“Java免费学习笔记(深入)”;
批量计算多个历史年份的周信息
结合循环或 Stream,可高效生成多年对比数据:
- 用
IntStream.rangeClosed(1, 5)表示过去 1–5 年 - 对每个偏移量调用
today.minusYears(yearsAgo) - 封装为 record 或 Map,包含日期、星期、ISO 周、所在周周一等字段
- 示例字段组合:
Map.of("date", d, "dow", d.getDayOfWeek(), "week", d.get(IsoFields.WEEK_OF_WEEK_YEAR))

