LocalDate 是 Java 8 引入的日期时间 API(位于 java.time 包)中的一个类,专门用于表示不含时间信息的日期(年、月、日),例如 2023-10-05。它是不可变的、线程安全的,相比传统的 Date 类更加直观和易用。
LocalDate 是 Java 8 引入的 java.time 日期时间 API 中的核心类之一,专门用于表示不含时间信息的日期,仅包含年、月、日三个字段(格式如 2023-10-05)。它解决了传统 java.util.Date 和 java.util.Calendar 类的设计缺陷,具有不可变性、线程安全性和直观的 API 设计,是处理纯日期场景的最佳选择。
不可变性:一旦创建,LocalDate 对象的值无法修改,所有修改操作(如增减天数)都会返回一个新的实例,避免线程安全问题。
纯日期信息:仅包含年、月、日,不涉及时区、时间(时 / 分 / 秒)或毫秒,适合生日、节假日等纯日期场景。
丰富的日期操作:提供了简洁的方法用于日期计算、字段提取和比较,无需手动处理月份天数差异、闰年等复杂逻辑。
记录生日、纪念日等仅需日期的信息
处理日历相关业务(如计算两个日期之间的天数)
数据库日期字段的映射(与 DATE 类型对应)
生成报表或日志中的日期标记
特性 | LocalDate | 传统 Date/Calendar |
时间信息 | 仅包含日期(年 / 月 / 日) | 包含日期 + 时间,甚至时区 |
可变性 | 不可变(线程安全) | 可变(线程不安全) |
API 设计 | 方法直观(如 plusDays()) | 方法繁琐(如 add(Calendar.DATE, 1)) |
时区依赖 | 与时区无关 | 隐含默认时区,易导致混淆 |
下面示例将演示 LocalDate 类的基本用法:
import java.time.LocalDate; public class LocalDateDemo { public static void main(String[] args) { // 获取当前日期 LocalDate today = LocalDate.now(); System.out.println("今天: " + today); // 输出: 2023-10-05(示例) // 计算10天后的日期 LocalDate future = today.plusDays(10); System.out.println("10天后: " + future); // 判断是否为闰年 boolean isLeap = today.isLeapYear(); System.out.println("今年是闰年? " + isLeap); } }
运行结果:
今天: 2025-09-01 10天后: 2025-09-11 今年是闰年? false
now() 是 LocalDate 类的静态方法,用于获取当前系统默认时区下的本地日期(仅包含年、月、日,不包含时间信息)。
基于系统时钟和默认时区,返回代表“今天”的 LocalDate 实例。例如,若系统当前日期是 2024 年 9 月 1 日,则返回 2024-09-01。
默认使用系统的时区(可通过 ZoneId.systemDefault() 获取),若需指定时区,可使用重载方法 LocalDate.now(ZoneId zone)。
该方法返回的 LocalDate 对象是不可变的,后续无法修改其日期值,确保线程安全。
示例:
import java.time.LocalDate; import java.time.ZoneId; public class LocalDateNowExample { public static void main(String[] args) { // 1. 获取系统默认时区的当前日期 LocalDate today = LocalDate.now(); System.out.println("系统默认时区的当前日期:" + today); // 例如:2024-09-01 // 2. 指定时区获取当前日期(如纽约时区) ZoneId newYorkZone = ZoneId.of("America/New_York"); LocalDate todayInNY = LocalDate.now(newYorkZone); System.out.println("纽约时区的当前日期:" + todayInNY); // 可能与默认时区不同 // 3. 验证无时间信息(仅日期) System.out.println("年份:" + today.getYear()); // 2024 System.out.println("月份:" + today.getMonthValue()); // 9 System.out.println("日:" + today.getDayOfMonth()); // 1 } }
运行结果:
系统默认时区的当前日期:2025-09-01 纽约时区的当前日期:2025-09-01 年份:2025 月份:9 日:1
注意事项:
若程序需要在不同时区下统一日期计算,建议显式指定时区(如 ZoneId.of("UTC")),避免依赖系统默认时区导致不一致。
该方法的实现依赖 Clock.systemDefaultZone()(默认时钟),若需模拟特定日期进行测试,可使用 LocalDate.now(Clock clock) 传入自定义时钟。
of() 方法是 LocalDate 类的一个静态工厂方法,用于根据指定的年、月、日创建一个 LocalDate 实例。它是创建 LocalDate 对象最常用的方式之一,返回的 LocalDate 不包含时间信息,仅表示一个具体的日历日期。
参数说明:
year:年份(支持正负值,例如公元元年为 1,公元前 1 年为 0,公元前 2 年为 -1 等)。
month:月份(1-12 的整数,1 代表 1 月,12 代表 12 月)。
dayOfMonth:当月的天数(需符合实际月份的天数,例如 1 月最多 31 天,2 月平年 28 天、闰年 29 天等)。
注意:该方法会自动校验参数是否符合日历规则,若无效则抛出 DateTimeException。如果月份传入 0 或 13、2 月传入 30 天等情况都会触发异常。
示例:
import java.time.LocalDate; import java.time.DateTimeException; public class LocalDateOfExample { public static void main(String[] args) { // 正常创建:2024年3月15日 LocalDate date1 = LocalDate.of(2024, 3, 15); System.out.println("创建的日期:" + date1); // 输出:2024-03-15 // 验证闰年2月29日(2024是闰年) LocalDate leapDay = LocalDate.of(2024, 2, 29); System.out.println("闰年2月29日:" + leapDay); // 输出:2024-02-29 // 无效参数示例(会抛出异常) try { // 2023年不是闰年,2月没有29天 LocalDate invalidDate = LocalDate.of(2023, 2, 29); } catch (DateTimeException e) { System.out.println("异常信息:" + e.getMessage()); // 输出:Invalid date 'February 29' as '2023' is not a leap year } } }
运行结果:
创建的日期:2024-03-15 闰年2月29日:2024-02-29 异常信息:Invalid date 'February 29' as '2023' is not a leap year
注意事项:
月份参数是1-based(1 代表 1 月),与 java.util.Calendar 类的 0-based 月份(0 代表 1 月)不同,使用时需注意区分。
若需要通过 Month 枚举类指定月份(如 Month.MARCH 代表 3 月),可使用重载方法 LocalDate.of(int year, Month month, int dayOfMonth),例如:LocalDate.of(2024, Month.MARCH, 15)(效果与 of(2024, 3, 15) 一致)。
用于在当前日期基础上增加指定天数,返回一个新的 LocalDate 实例。由于 LocalDate 是不可变类,原实例不会被修改。
方法参数与返回值:
参数:daysToAdd(long 类型),表示要增加的天数(支持负数,即减去指定天数)。
返回值:一个新的 LocalDate 实例,代表增加天数后的日期。
注意:
(1) 该方法无需手动计算月份 / 年份的边界(如月底加一天自动进入下月,年底加一天自动进入下年)。例如:2024-02-28 加 1 天 → 2024-02-29(2024 是闰年);2023-12-31 加 1 天 → 2024-01-01。
(2) 支持负数参数,当 daysToAdd 为负数时,等效于减去指定天数(与 minusDays(long daysToSubtract) 效果一致)。例如:plusDays(-3) 等同于减去 3 天。
示例:
import java.time.LocalDate; public class LocalDatePlusDaysExample { public static void main(String[] args) { // 基础日期:2024-03-15 LocalDate baseDate = LocalDate.of(2024, 3, 15); System.out.println("基础日期:" + baseDate); // 1. 增加正数天数(跨月) LocalDate plus10Days = baseDate.plusDays(10); System.out.println("加10天:" + plus10Days); // 2024-03-25 // 2. 增加天数跨月(3月有31天) LocalDate crossMonth = baseDate.plusDays(20); System.out.println("加20天(跨月):" + crossMonth); // 2024-04-04 // 3. 增加天数跨年 LocalDate crossYear = LocalDate.of(2024, 12, 30).plusDays(5); System.out.println("加5天(跨年):" + crossYear); // 2025-01-04 // 4. 传入负数(等效于减天数) LocalDate minus5Days = baseDate.plusDays(-5); System.out.println("加-5天(即减5天):" + minus5Days); // 2024-03-10 } }
运行结果:
基础日期:2024-03-15 加10天:2024-03-25 加20天(跨月):2024-04-04 加5天(跨年):2025-01-04 加-5天(即减5天):2024-03-10
注意,若需要增加月份或年份,可使用同类方法 plusMonths(long monthsToAdd) 或 plusYears(long yearsToAdd),它们同样会自动处理日历规则。
用于在当前日期基础上减去指定的月份数,返回一个新的 LocalDate 实例。由于 LocalDate 是不可变类,原实例不会被修改。
方法参数与返回值:
参数:monthsToSubtract(long 类型),表示要减去的月份数(支持负数,即等效于增加指定月份)。
返回值:一个新的 LocalDate 实例,代表减去月份后的日期。
注意:
(1)当减去月份后导致日期超出目标月份的最大天数时,会自动调整为目标月份的最后一天。例如:2024-03-31 减去 1 个月 → 2024-02-29(2024 是闰年,2 月最多 29 天);2023-03-31 减去 1 个月 → 2023-02-28。
(2)当 monthsToSubtract 为负数时,等效于增加指定月份(与 plusMonths(long monthsToAdd) 效果一致)。例如:minusMonths(-3) 等同于增加 3 个月。
示例:
import java.time.LocalDate; public class LocalDateMinusMonthsExample { public static void main(String[] args) { // 基础日期:2024-05-15 LocalDate baseDate = LocalDate.of(2024, 5, 15); System.out.println("基础日期:" + baseDate); // 1. 减去1个月 LocalDate minus1Month = baseDate.minusMonths(1); System.out.println("减1个月:" + minus1Month); // 2024-04-15 // 2. 减去3个月(跨年) LocalDate crossYear = LocalDate.of(2024, 2, 10).minusMonths(3); System.out.println("减3个月(跨年):" + crossYear); // 2023-11-10 // 3. 处理月份天数溢出(自动调整为当月最后一天) LocalDate overflowDate1 = LocalDate.of(2024, 3, 31).minusMonths(1); System.out.println("3月31日减1个月:" + overflowDate1); // 2024-02-29(闰年) LocalDate overflowDate2 = LocalDate.of(2023, 3, 31).minusMonths(1); System.out.println("2023年3月31日减1个月:" + overflowDate2); // 2023-02-28(平年) // 4. 传入负数(等效于加月份) LocalDate plus2Months = baseDate.minusMonths(-2); System.out.println("减-2个月(即加2个月):" + plus2Months); // 2024-07-15 } }
运行结果:
基础日期:2024-05-15 减1个月:2024-04-15 减3个月(跨年):2023-11-10 3月31日减1个月:2024-02-29 2023年3月31日减1个月:2023-02-28 减-2个月(即加2个月):2024-07-15
注意事项:
月份增减的逻辑是 “优先保持日期,超出则取月末”,这与人类日常习惯一致(例如 “2024-01-30 减 1 个月” 会得到 “2023-12-30”,而 “2024-03-30 减 1 个月” 会得到 “2024-02-29”)。
若需要减去天数或年份,可使用同类方法 minusDays(long daysToSubtract) 或 minusYears(long yearsToSubtract)。
用于修改当前日期的年份,返回一个新的 LocalDate 实例。由于 LocalDate 是不可变类,原实例的年份不会被修改。
方法参数与返回值:
参数:year(int 类型),表示要设置的新年份(支持正负值,如公元前年份)。
返回值:一个新的 LocalDate 实例,其年份为指定值,月和日与原实例保持一致(若新年份导致日期无效,会自动调整)。
注意:
(1)当修改年份后,原日期的 “月 - 日” 组合在新年份中无效时(如 2023-02-29 改为 2024 年时),会自动调整为有效日期(2024-02-29 是合法的闰年日期,无需调整;而 2024-02-29 改为 2025 年时,会调整为 2025-02-28)。
(2)仅修改年份,原日期的月份和天数会尽可能保留(除非因闰年 / 平年导致无效)。
示例:
import java.time.LocalDate; public class LocalDateWithYearExample { public static void main(String[] args) { // 基础日期:2023-03-15 LocalDate baseDate = LocalDate.of(2023, 3, 15); System.out.println("基础日期:" + baseDate); // 1. 修改为指定年份(2024) LocalDate newYearDate = baseDate.withYear(2024); System.out.println("修改为2024年:" + newYearDate); // 2024-03-15 // 2. 处理闰年2月29日的特殊情况 LocalDate leapDay = LocalDate.of(2024, 2, 29); // 2024是闰年 System.out.println("原闰年日期:" + leapDay); // 改为平年(2025),2月29日无效,自动调整为2月28日 LocalDate adjustedDate = leapDay.withYear(2025); System.out.println("改为2025年(平年):" + adjustedDate); // 2025-02-28 // 3. 改为公元前年份 LocalDate bcDate = baseDate.withYear(-5); // 公元前5年 System.out.println("改为公元前5年:" + bcDate); // -0005-03-15 // 4. 保持月日不变(即使跨多年) LocalDate decadeLater = baseDate.withYear(2033); System.out.println("改为2033年:" + decadeLater); // 2033-03-15 } }
运行结果:
基础日期:2023-03-15 修改为2024年:2024-03-15 原闰年日期:2024-02-29 改为2025年(平年):2025-02-28 改为公元前5年:-0005-03-15 改为2033年:2033-03-15
注意事项:
若需修改月份,可使用 withMonth(int month);修改天数,可使用 withDayOfMonth(int dayOfMonth);修改为当月第几天,还可使用 withDayOfYear(int dayOfYear)(如 withDayOfYear(1) 表示当年 1 月 1 日)。
日期调整逻辑遵循 “尽可能保留原月日,无效则调整为当月最后一天” 的规则,与人类对日期的直觉理解一致。
用于获取当前日期对象中的年份值(以整数形式返回)。支持正负年份:
公元后年份为正数(如 2024、1990)。
公元前年份为负数(如公元前 5 年返回 -5,公元前 1 年返回 0)。
示例:
import java.time.LocalDate; public class LocalDateGetYearExample { public static void main(String[] args) { // 1. 获取当前日期的年份 LocalDate today = LocalDate.now(); int currentYear = today.getYear(); System.out.println("当前年份:" + currentYear); // 例如:2024 // 2. 获取指定日期的年份 LocalDate specificDate = LocalDate.of(1995, 12, 3); int year = specificDate.getYear(); System.out.println("指定日期的年份:" + year); // 输出:1995 // 3. 处理公元前年份 LocalDate bcDate = LocalDate.of(-4712, 1, 1); // 天文历法中的起始日期 int bcYear = bcDate.getYear(); System.out.println("公元前年份:" + bcYear); // 输出:-4712 // 4. 结合日期修改方法使用 LocalDate modifiedDate = specificDate.withYear(2028); System.out.println("修改后的年份:" + modifiedDate.getYear()); // 输出:2028 } }
运行结果:
当前年份:2025 指定日期的年份:1995 公元前年份:-4712 修改后的年份:2028
注意事项:
与 java.util.Date 类不同,LocalDate 直接提供 getYear() 方法获取直观的年份(如 2024 直接返回 2024),无需额外计算(Date 类需通过 Calendar 转换才能得到正确年份)。
若需获取月份或天数,可使用同类方法 getMonthValue()(返回 1-12 的月份值)或 getDayOfMonth()(返回当月天数)。
用于获取当前日期中月份的数值(1-12),其中 1 代表 1 月,12 代表 12 月。与日常生活中对月份的称呼一致(1 月即返回 1),无需像 java.util.Calendar 那样进行 +1 调整(Calendar 中 0 代表 1 月)。
示例:
import java.time.LocalDate; public class LocalDateGetMonthValueExample { public static void main(String[] args) { // 1. 获取当前日期的月份 LocalDate today = LocalDate.now(); int currentMonth = today.getMonthValue(); System.out.println("当前月份(数值):" + currentMonth); // 例如:9(代表9月) // 2. 获取指定日期的月份 LocalDate christmas = LocalDate.of(2024, 12, 25); int christmasMonth = christmas.getMonthValue(); System.out.println("圣诞节所在月份:" + christmasMonth); // 输出:12(12月) // 3. 结合月份修改方法使用 LocalDate modifiedDate = christmas.withMonth(6); // 修改为6月 System.out.println("修改后的月份:" + modifiedDate.getMonthValue()); // 输出:6(6月) // 4. 遍历一年中的所有月份 System.out.println("\n一年中的所有月份数值:"); LocalDate base = LocalDate.of(2024, 1, 1); for (int i = 0; i < 12; i++) { System.out.println(base.plusMonths(i).getMonthValue() + "月"); } } }
运行结果:
当前月份(数值):9 圣诞节所在月份:12 修改后的月份:6 一年中的所有月份数值: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
注意事项:若需要获取月份的枚举对象(如 Month.JANUARY)而非数值,可使用 getMonth() 方法,例如:Month month = LocalDate.now().getMonth();(返回 Month.SEPTEMBER 代表 9 月)。
用于获取当前日期对应的星期几(星期几),返回 DayOfWeek 枚举类型。DayOfWeek 枚举对象,包含 7 个枚举常量,分别对应周一到周日:
MONDAY(周一)、TUESDAY(周二)、WEDNESDAY(周三)、THURSDAY(周四)、FRIDAY(周五)、SATURDAY(周六)、SUNDAY(周日)。
注意,DayOfWeek 枚举类还提供了额外方法,如 getValue() 可获取 1-7 的数值(1 代表周一,7 代表周日),方便进行数值化处理。
示例:
import java.time.DayOfWeek; import java.time.LocalDate; public class LocalDateGetDayOfWeekExample { public static void main(String[] args) { // 1. 获取当前日期的星期几 LocalDate today = LocalDate.now(); DayOfWeek todayOfWeek = today.getDayOfWeek(); System.out.println("当前星期:" + todayOfWeek); // 例如:MONDAY(周一) // 2. 获取星期对应的数值(1=周一,7=周日) int dayValue = todayOfWeek.getValue(); System.out.println("星期对应数值:" + dayValue); // 例如:1 // 3. 检查指定日期是周末还是工作日 LocalDate weekend = LocalDate.of(2024, 9, 7); // 2024-09-07 是周六 DayOfWeek weekendDay = weekend.getDayOfWeek(); if (weekendDay == DayOfWeek.SATURDAY || weekendDay == DayOfWeek.SUNDAY) { System.out.println(weekend + " 是周末"); // 输出:2024-09-07 是周末 } // 4. 遍历一周的所有星期 System.out.println("\n一周的所有星期:"); for (DayOfWeek day : DayOfWeek.values()) { System.out.println(day + "(数值:" + day.getValue() + ")"); } } }
运行结果:
当前星期:MONDAY 星期对应数值:1 2024-09-07 是周末 一周的所有星期: MONDAY(数值:1) TUESDAY(数值:2) WEDNESDAY(数值:3) THURSDAY(数值:4) FRIDAY(数值:5) SATURDAY(数值:6) SUNDAY(数值:7)
注意事项:
与传统 java.util.Calendar 不同(Calendar 中 1 代表周日),DayOfWeek 遵循国际标准,1 代表周一,7 代表周日,更符合全球多数地区的习惯。
若需直接获取星期的中文描述,可结合 java.time.format.TextStyle 实现本地化显示,例如:
String chineseDay = todayOfWeek.getDisplayName(TextStyle.FULL, Locale.CHINESE);(返回 “星期一”)。
用于判断当前日期是否在另一个日期之后,返回 boolean 类型结果(true 表示当前日期在参数日期之后,false 则表示不满足)。
方法参数与返回值:
参数:other(LocalDate 类型),表示要比较的另一个日期。
返回值:boolean 值,true 当且仅当当前日期严格晚于 other 日期,否则为 false(包括等于的情况)。
注意:
(1) 仅当当前日期在参数日期的 “之后”(即更晚)时返回 true,若两个日期相等则返回 false。
(2)仅比较年、月、日,不涉及时间信息(与 LocalDateTime.isAfter() 不同)。
(3)参数为 null 时会抛出 NullPointerException,需提前处理 null 情况。
示例:
import java.time.LocalDate; public class LocalDateIsAfterExample { public static void main(String[] args) { // 基础日期:2024-09-01 LocalDate baseDate = LocalDate.of(2024, 9, 1); // 1. 比较当前日期是否在之后(参数日期更早) LocalDate earlierDate = LocalDate.of(2024, 8, 31); boolean isAfter1 = baseDate.isAfter(earlierDate); System.out.println(baseDate + " 是否在 " + earlierDate + " 之后?" + isAfter1); // true // 2. 比较当前日期是否在之后(参数日期更晚) LocalDate laterDate = LocalDate.of(2024, 9, 2); boolean isAfter2 = baseDate.isAfter(laterDate); System.out.println(baseDate + " 是否在 " + laterDate + " 之后?" + isAfter2); // false // 3. 比较相等的日期 LocalDate sameDate = LocalDate.of(2024, 9, 1); boolean isAfter3 = baseDate.isAfter(sameDate); System.out.println(baseDate + " 是否在 " + sameDate + " 之后?" + isAfter3); // false // 4. 跨年份比较 LocalDate lastYear = LocalDate.of(2023, 12, 31); boolean isAfter4 = baseDate.isAfter(lastYear); System.out.println(baseDate + " 是否在 " + lastYear + " 之后?" + isAfter4); // true } }
运行结果:
2024-09-01 是否在 2024-08-31 之后?true 2024-09-01 是否在 2024-09-02 之后?false 2024-09-01 是否在 2024-09-01 之后?false 2024-09-01 是否在 2023-12-31 之后?true
注意事项:
isBefore(LocalDate other) 用于判断当前日期是否在参数日期之前。
若需判断两个日期是否相等,应使用 isEqual(LocalDate other) 方法(baseDate.isEqual(otherDate))。
常用于日期区间校验(如判断某个日期是否在有效范围内)、排序等场景。
用于判断当前日期是否在另一个日期之前,返回 boolean 类型结果(true 表示当前日期在参数日期之前,false 则表示不满足)。
方法参数与返回值:
参数:other(LocalDate 类型),表示要比较的另一个日期。
返回值:boolean 值,true 当且仅当当前日期严格早于 other 日期,否则为 false(包括等于的情况)。
注意:
(1)仅当当前日期在参数日期的 “之前”(即更早)时返回 true,若两个日期相等则返回 false。
(2)仅基于年、月、日进行比较,不涉及任何时间信息,与包含时间的 LocalDateTime 比较逻辑不同。
(3)参数为 null 时会抛出 NullPointerException,实际使用中需确保参数非空或提前判断。
示例:
import java.time.LocalDate; public class LocalDateIsBeforeExample { public static void main(String[] args) { // 基础日期:2024-05-20 LocalDate baseDate = LocalDate.of(2024, 5, 20); // 1. 比较当前日期是否在之前(参数日期更晚) LocalDate laterDate = LocalDate.of(2024, 5, 21); boolean isBefore1 = baseDate.isBefore(laterDate); System.out.println(baseDate + " 是否在 " + laterDate + " 之前?" + isBefore1); // true // 2. 比较当前日期是否在之前(参数日期更早) LocalDate earlierDate = LocalDate.of(2024, 5, 19); boolean isBefore2 = baseDate.isBefore(earlierDate); System.out.println(baseDate + " 是否在 " + earlierDate + " 之前?" + isBefore2); // false // 3. 比较相等的日期 LocalDate sameDate = LocalDate.of(2024, 5, 20); boolean isBefore3 = baseDate.isBefore(sameDate); System.out.println(baseDate + " 是否在 " + sameDate + " 之前?" + isBefore3); // false // 4. 跨月/跨年比较 LocalDate nextMonth = LocalDate.of(2024, 6, 1); LocalDate lastYear = LocalDate.of(2023, 12, 31); System.out.println(baseDate + " 是否在 " + nextMonth + " 之前?" + baseDate.isBefore(nextMonth)); // true System.out.println(baseDate + " 是否在 " + lastYear + " 之前?" + baseDate.isBefore(lastYear)); // false } }
运行结果:
2024-05-20 是否在 2024-05-21 之前?true 2024-05-20 是否在 2024-05-19 之前?false 2024-05-20 是否在 2024-05-20 之前?false 2024-05-20 是否在 2024-06-01 之前?true 2024-05-20 是否在 2023-12-31 之前?false
注意事项:
isAfter(LocalDate other) 用于判断当前日期是否在参数日期之后,两者逻辑相反。
若需判断两个日期是否完全相同,应使用 isEqual(LocalDate other) 方法(如 date1.isEqual(date2))。
常用于日期范围校验(如判断某个日期是否在有效区间内)、排序逻辑等。
用于判断当前日期所在的年份是否为闰年,返回 boolean 类型结果(true 表示闰年,false 表示平年)。
遵循公历闰年规则进行判断,闰年规则如下:
能被 4 整除,但不能被 100 整除的年份是闰年(如 2024 年)。
能被 400 整除的年份是闰年(如 2000 年)。
其他情况为平年(如 2023 年、1900 年)。
示例:
import java.time.LocalDate; public class LocalDateIsLeapYearExample { public static void main(String[] args) { // 1. 判断当前年份是否为闰年 LocalDate today = LocalDate.now(); boolean isCurrentLeap = today.isLeapYear(); System.out.println(today.getYear() + "年是否为闰年?" + isCurrentLeap); // 如2024年返回true // 2. 测试能被4整除但不能被100整除的年份(闰年) LocalDate date2024 = LocalDate.of(2024, 3, 1); System.out.println("2024年是否为闰年?" + date2024.isLeapYear()); // true // 3. 测试能被400整除的年份(闰年) LocalDate date2000 = LocalDate.of(2000, 5, 10); System.out.println("2000年是否为闰年?" + date2000.isLeapYear()); // true // 4. 测试能被100整除但不能被400整除的年份(平年) LocalDate date1900 = LocalDate.of(1900, 12, 31); System.out.println("1900年是否为闰年?" + date1900.isLeapYear()); // false // 5. 测试不能被4整除的年份(平年) LocalDate date2023 = LocalDate.of(2023, 2, 28); System.out.println("2023年是否为闰年?" + date2023.isLeapYear()); // false } }
运行结果:
2025年是否为闰年?false 2024年是否为闰年?true 2000年是否为闰年?true 1900年是否为闰年?false 2023年是否为闰年?false
注意,闰年的 2 月有 29 天,平年的 2 月只有 28 天。可结合 lengthOfMonth() 方法验证:
LocalDate feb2024 = LocalDate.of(2024, 2, 1); System.out.println("2024年2月天数:" + feb2024.lengthOfMonth()); // 29(闰年) LocalDate feb2023 = LocalDate.of(2023, 2, 1); System.out.println("2023年2月天数:" + feb2023.lengthOfMonth()); // 28(平年)
该方法仅依赖年份,因此同一公历年份内的所有日期调用此方法会返回相同结果。例如,2024-01-01 和 2024-12-31 的 isLeapYear() 结果均为 true。
LocalDate 提供了清晰、直观的日期处理方法,避免了传统日期类的线程安全问题和设计缺陷。其不可变特性使得它在多线程环境中使用更加安全,同时丰富的方法也简化了日期计算、比较等常见操作。在处理仅需日期(不含时间)的场景时,LocalDate 是首选的类。