1. 方法定义
// 日期增减方法(均返回新对象)
LocalDate plusDays(long daysToAdd) // 增加天数
LocalDate plusWeeks(long weeksToAdd) // 增加周数(1周=7天)
LocalDate plusMonths(long monthsToAdd) // 增加月数(智能月末处理)
LocalDate plusYears(long yearsToAdd) // 增加年数(自动处理闰年)
2. 功能说明
方法 | 关键特性 | 特殊场景处理 |
---|---|---|
plusDays() |
简单日期推移,可跨月/年 | 无特殊逻辑 |
plusWeeks() |
按7天倍数计算 | 等价于plusDays(weeks*7) |
plusMonths() |
智能月末调整 | 1月31日+1个月=2月28/29日 |
plusYears() |
自动处理闰年 | 2020-02-29+1年=2021-02-28 |
3. 示例代码
基础操作
LocalDate date = LocalDate.of(2023, 1, 31);
System.out.println(date.plusDays(1)); // 2023-02-01(跨月)
System.out.println(date.plusWeeks(2)); // 2023-02-14(14天后)
System.out.println(date.plusMonths(1)); // 2023-02-28(自动调整月末)
System.out.println(date.plusYears(1)); // 2024-01-31(非闰年正常)
闰年处理
LocalDate leapDay = LocalDate.of(2020, 2, 29);
// 闰年特殊处理
System.out.println(leapDay.plusYears(1)); // 2021-02-28(非闰年调整)
System.out.println(leapDay.plusYears(4)); // 2024-02-29(闰年保留29日)
负值操作(日期回溯)
LocalDate today = LocalDate.now();
System.out.println(today.plusDays(-7)); // 等价于minusDays(7)
System.out.println(today.plusMonths(-2)); // 两个月前的日期
4. 使用技巧
月末保留策略
需要保持月末日期时使用TemporalAdjusters
:LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfMonth()); LocalDate nextMonthLastDay = lastDay.plusMonths(1);
周期性计算
结合循环生成日期序列:// 生成未来4周的每周一日期 LocalDate nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); List<LocalDate> mondays = new ArrayList<>(); for (int i = 0; i < 4; i++) { mondays.add(nextMonday.plusWeeks(i)); }
日期边界检查
增减前后验证日期有效性:LocalDate newDate = date.plusMonths(6); if (newDate.isAfter(LocalDate.MAX)) { throw new DateTimeException("超出日期范围"); }
5. 常见错误
错误类型 | 后果 | 解决方案 |
---|---|---|
误认为修改原对象 | 日期未变化 | 必须接收返回值:date = date.plusDays(1) |
忽略月末调整机制 | 预期2月31日等非法日期 | 理解自动调整逻辑 |
闰年2月29日直接加1年 | 得到无效日期(非闰年) | 使用plusYears() 自动处理 |
超大数值导致溢出 | DateTimeException |
检查Long.MAX_VALUE 边界 |
6. 注意事项
不可变性
每次操作返回新对象:LocalDate d1 = LocalDate.of(2023, 1, 1); LocalDate d2 = d1.plusMonths(1); System.out.println(d1); // 2023-01-01(原对象不变)
月末处理规则
| 输入日期 | 操作 | 结果 | 原理 | |--------------------|-------------------|-------------------|--------------------------| | 2023-01-31 |plusMonths(1)
| 2023-02-28 | 自动调整为目标月最后一天 | | 2020-02-29(闰年) |plusYears(1)
| 2021-02-28 | 非闰年调整为28日 | | 2023-03-31 |plusMonths(1)
| 2023-04-30 | 目标月无31日 |时区无关性
LocalDate
无时区概念,增减操作基于纯日历计算
7. 最佳实践与性能优化
批量操作优化
避免链式调用中的重复计算:// 低效做法(创建多个中间对象) LocalDate result = date.plusDays(1).plusWeeks(1).plusMonths(1); // 高效做法(单次计算) LocalDate result = date.plusDays(1+7).plusMonths(1); // 合并周/天计算
缓存高频操作
对固定周期的日期进行缓存:// 缓存未来30天日期(避免重复计算) Map<Integer, LocalDate> dateCache = new HashMap<>(); for (int i = 0; i < 30; i++) { dateCache.put(i, LocalDate.now().plusDays(i)); }
金融日期计算
使用Tenor
对象处理复杂周期:public enum Tenor { DAY, WEEK, MONTH, YEAR; public LocalDate addTo(LocalDate date, int units) { switch (this) { case DAY: return date.plusDays(units); case WEEK: return date.plusWeeks(units); case MONTH: return date.plusMonths(units); case YEAR: return date.plusYears(units); default: throw new IllegalArgumentException(); } } } // 使用示例 LocalDate maturity = Tenor.MONTH.addTo(tradeDate, 3);
总结
关键点 | 行动指南 |
---|---|
智能调整 | plusMonths/plusYears 自动处理月末和闰年 |
对象不可变 | 所有操作返回新对象,必须接收返回值 |
负值操作 | 支持负数参数实现日期回溯 |
性能优化 | 合并计算(days+weeks ),缓存高频结果 |
边界安全 | 检查Long 范围,捕获DateTimeException |
特殊场景 | 月末需求使用TemporalAdjusters.lastDayOfMonth() |