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. 使用技巧

  1. 月末保留策略
    需要保持月末日期时使用TemporalAdjusters

    LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfMonth());
    LocalDate nextMonthLastDay = lastDay.plusMonths(1);
    
  2. 周期性计算
    结合循环生成日期序列:

    // 生成未来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));
    }
    
  3. 日期边界检查
    增减前后验证日期有效性:

    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. 注意事项

  1. 不可变性
    每次操作返回新对象:

    LocalDate d1 = LocalDate.of(2023, 1, 1);
    LocalDate d2 = d1.plusMonths(1);
    System.out.println(d1);  // 2023-01-01(原对象不变)
    
  2. 月末处理规则
    | 输入日期 | 操作 | 结果 | 原理 | |--------------------|-------------------|-------------------|--------------------------| | 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日 |

  3. 时区无关性
    LocalDate 无时区概念,增减操作基于纯日历计算


7. 最佳实践与性能优化

  1. 批量操作优化
    避免链式调用中的重复计算:

    // 低效做法(创建多个中间对象)
    LocalDate result = date.plusDays(1).plusWeeks(1).plusMonths(1);
    
    // 高效做法(单次计算)
    LocalDate result = date.plusDays(1+7).plusMonths(1); // 合并周/天计算
    
  2. 缓存高频操作
    对固定周期的日期进行缓存:

    // 缓存未来30天日期(避免重复计算)
    Map<Integer, LocalDate> dateCache = new HashMap<>();
    for (int i = 0; i < 30; i++) {
        dateCache.put(i, LocalDate.now().plusDays(i));
    }
    
  3. 金融日期计算
    使用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()