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