跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何在 Java 中使用 LocalDate.with(TemporalAdjusters.firstDayOfNextMonth())

LocalDate.with(TemporalAdjusters.firstDayOfNextMonth()) 返回当前月份下一个月的第一天,如2024-01-15或2024-01-31均得2024-02-01;其底层等价于date.plusMonths(1).withDayOfMonth(1),不依赖原日值,安全处理跨年与闰月。 LocalDate.with 为什么返回的不是下个月第一天? 直接调用
LocalDate.with(TemporalAdjusters.firstDayOfNextMonth())
本身没有错,但常见误解是以为它能“自动推到下个月”——其实它只在当前日期基础上应用调整器,而
firstDayOfNextMonth()
的逻辑是:取当前日期所在月份的下一个月的第一天。也就是说,如果当前是
2024-01-31
,结果仍是
2024-02-01
;但如果当前是
2024-01-15
,结果还是
2024-02-01
。它不关心“今天是不是月底”,只按月历位置计算。 TemporalAdjusters.firstDayOfNextMonth() 的实际行为 这个调整器本质是把任意
LocalDate
映射到「当前月份+1」的第 1 天,底层等价于:
date.plusMonths(1).withDayOfMonth(1)
。注意两点:
plusMonths(1)
是安全的(自动处理 1 月→2 月、12 月→下一年 1 月) 它不依赖当前日期的 day-of-month 值,
2024-01-01
和
2024-01-31
调用后都得到
2024-02-01
如果当前是
2024-01-29
,不会因为 2 月没 29 日而报错或回退——它根本不看原日值 常见误用与替代写法 有人想“从今天起跳到下个月第一天”,却写了
LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth())
,这没问题;但若误以为它能“修正到最近的下月首日”,比如把
2024-01-01
改成
2024-02-01
(其实是对的),再把
2024-02-01
改成
2024-03-01
(也对),那就没毛病。真正容易错的是混用其他调整器,比如: 误写成
with(TemporalAdjusters.firstDayOfMonth())
→ 得到当月第一天,不是下月 误用
with(TemporalAdjusters.lastDayOfNextMonth())
→ 这个方法不存在!会编译失败 想“下个月同一天但跨月时取最后一天”,得自己写逻辑,不能靠内置调整器 示例正确写法: Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 立即学习 “ Java免费学习笔记(深入) ”;
LocalDate today = LocalDate.of(2024, 1, 15); LocalDate nextMonthFirst = today.with(TemporalAdjusters.firstDayOfNextMonth()); // 结果:2024-02-01
性能和线程安全要注意什么?
LocalDate
和
TemporalAdjusters
都是不可变对象,
with()
返回新实例,无副作用。所以: 多次调用
with()
不影响原对象,无需担心状态污染 调整器实例(如
TemporalAdjusters.firstDayOfNextMonth()
)可复用,没必要每次 new 没有隐式时区或系统时钟依赖,纯日期运算,适合做确定性测试 唯一需要留心的是:如果你在循环里反复构造
LocalDate.now()
再调用
with
,要注意
now()
可能跨秒变化,导致结果不一致——这不是
with
的问题,而是时间点选取策略问题。

相关文章