java 8 引入的 java.time api 通过 plus() 和 minus() 方法对日期进行加减运算,这些方法返回一个新的不可变对象,不会修改原实例。具体做法是调用 localdate、localdatetime 或 zoneddatetime 实例上的对应方法,传入 temporalamount(如 period 或 duration)或直接指定数量与单位(如 chronounit.days)。这样做能确保线程安全并避免时区转换中的潜在错误。

如何使用 plusDays 和 minusDays 进行天数加减
使用 plusDays() 和 minusDays() 可以直接对 LocalDate 进行天数的加减。这两个方法接受一个 long 类型的参数,表示要增加或减少的天数。如果结果为负数或超出范围,会抛出 DateTimeException。这种方式简单直观,适用于不需要处理月份或年份复杂逻辑的场景。

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class DateArithmetic {
public static void main(String[] args) {
LocalDate today = LocalDate.of(2023, 10, 15);
// 加 5 天
LocalDate future = today.plusDays(5);
System.out.println("未来日期: " + future); // 2023-10-20
// 减 3 天
LocalDate past = today.minusDays(3);
System.out.println("过去日期: " + past); // 2023-10-12
// 使用 ChronoUnit 加 1 个月
LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS);
System.out.println("下月同日: " + nextMonth); // 2023-11-15
}
}如何处理月份和年份的加减及边界情况
对于月份和年份的加减,推荐使用 plusMonths()、plusYears() 等方法,或者使用通用的 plus(long amountToAdd, TemporalUnit unit) 方法。当遇到月末日期(如 1月31日)加一个月时,API 会自动调整到有效日期(如 2月28日或29日),这称为“智能回退”。这种机制避免了无效日期的产生,但开发者需注意其行为是否符合业务逻辑。
立即学习“Java免费学习笔记(深入)”;

import java.time.LocalDate;
import java.time.Month;
public class MonthBoundaryTest {
public static void main(String[] args) {
LocalDate jan31 = LocalDate.of(2023, Month.JANUARY, 31);
// 加 1 个月:1月31日 -> 2月28日(非闰年)
LocalDate feb28 = jan31.plusMonths(1);
System.out.println("1月31日加1月: " + feb28); // 2023-02-28
// 减 1 个月:3月31日 -> 2月28日
LocalDate mar31 = LocalDate.of(2023, Month.MARCH, 31);
LocalDate feb28Back = mar31.minusMonths(1);
System.out.println("3月31日减1月: " + feb28Back); // 2023-02-28
// 加 1 年:2024-02-29(闰年)-> 2025-02-28
LocalDate leapDay = LocalDate.of(2024, Month.FEBRUARY, 29);
LocalDate nonLeap = leapDay.plusYears(1);
System.out.println("闰年2月29日加1年: " + nonLeap); // 2025-02-28
}
}在闰年2月29日进行加减运算时会发生什么
当对闰年的2月29日进行加减运算时,java.time API 会根据目标年份是否为闰年来自动调整日期。例如,从2024年2月29日加一年会得到2025年2月28日,因为2025年不是闰年。同样,从2025年2月28日减一年会得到2024年2月29日。这种行为确保了日期的有效性,但在需要精确匹配特定日期的场景中,开发者应显式检查结果日期是否与原计划一致。


















