Java LocalDate 类
最后修改时间:2025 年 4 月 16 日
java.time.LocalDate
类表示在 ISO-8601 格式 (yyyy-MM-dd) 中没有时间和时区的日期。它用于表示生日、假期或任何特定于日期的信息。
LocalDate
是不可变的且线程安全的。它提供了获取、操作和计算日期的方法。该类处理从 -999,999,999 到 +999,999,999 年的日期,精确到日。
LocalDate 类概述
LocalDate
提供了创建日期、解析字符串和执行计算的方法。关键操作包括日期算术、比较和字段访问。该类遵循 ISO 日历系统。
public final class LocalDate implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable { public static LocalDate now(); public static LocalDate of(int year, int month, int dayOfMonth); public static LocalDate parse(CharSequence text); public int getYear(); public Month getMonth(); public int getDayOfMonth(); public DayOfWeek getDayOfWeek(); public boolean isLeapYear(); public boolean isAfter(ChronoLocalDate other); public boolean isBefore(ChronoLocalDate other); public LocalDate plusDays(long daysToAdd); public LocalDate minusMonths(long monthsToSubtract); }
以上代码展示了 LocalDate
提供的主要方法。这些方法允许创建、比较和操作日期。该类提供了多种访问日期组件和执行计算的方式。
创建 LocalDate 对象
LocalDate 对象可以通过多种方式创建。最常见的方法是使用 now
获取当前日期,以及使用工厂方法创建特定日期。也支持从字符串解析。
package com.zetcode; import java.time.LocalDate; import java.time.Month; public class Main { public static void main(String[] args) { // Current date LocalDate today = LocalDate.now(); System.out.println("Today: " + today); // Specific date LocalDate date1 = LocalDate.of(2025, 5, 15); System.out.println("Specific date: " + date1); // Using Month enum LocalDate date2 = LocalDate.of(2025, Month.JUNE, 20); System.out.println("Using Month enum: " + date2); // From string LocalDate parsed = LocalDate.parse("2025-07-04"); System.out.println("Parsed from string: " + parsed); } }
此示例演示了创建 LocalDate 对象的不同方法。输出显示了 ISO-8601 格式的日期。now
方法使用系统时钟和默认时区。
获取日期组件
LocalDate 可以分解成其年、月和日组件。可以使用各种 getter 方法访问这些值。该类提供了基于数字和枚举的访问方式。
package com.zetcode; import java.time.LocalDate; import java.time.Month; import java.time.DayOfWeek; public class Main { public static void main(String[] args) { LocalDate date = LocalDate.of(2025, 8, 12); // Get year int year = date.getYear(); System.out.println("Year: " + year); // Get month (enum) Month month = date.getMonth(); System.out.println("Month: " + month); // Get day of month int day = date.getDayOfMonth(); System.out.println("Day: " + day); // Get day of week DayOfWeek dayOfWeek = date.getDayOfWeek(); System.out.println("Day of week: " + dayOfWeek); // Check leap year boolean isLeap = date.isLeapYear(); System.out.println("Is leap year: " + isLeap); } }
此示例显示了如何从 LocalDate 中提取组件。Month 和 DayOfWeek 枚举提供了比数值更易读的替代方案。闰年检查对于日期验证很有用。
比较日期
可以比较 LocalDate 对象以确定时间顺序。该类提供了 isBefore
、isAfter
和 compareTo
方法。这些比较对于基于日期的逻辑至关重要。
package com.zetcode; import java.time.LocalDate; public class Main { public static void main(String[] args) { LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plusDays(1); LocalDate yesterday = today.minusDays(1); System.out.println("Today is before tomorrow: " + today.isBefore(tomorrow)); System.out.println("Today is after yesterday: " + today.isAfter(yesterday)); System.out.println("Comparison result: " + today.compareTo(tomorrow)); // Equality check LocalDate sameDate = LocalDate.of(today.getYear(), today.getMonth(), today.getDayOfMonth()); System.out.println("Today equals sameDate: " + today.equals(sameDate)); } }
此示例演示了比较 LocalDate 对象的各种方法。比较方法考虑了所有日期组件。请注意,相等性要求所有组件完全匹配。
添加和减去时间
LocalDate 通过 plus
和 minus
方法支持日期算术。这些操作对于计算未来或过去的日期很有用。该类正确处理月份和年份的边界。
package com.zetcode; import java.time.LocalDate; import java.time.Period; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) { LocalDate date = LocalDate.of(2025, 1, 15); // Add days LocalDate nextWeek = date.plusDays(7); System.out.println("Next week: " + nextWeek); // Subtract months LocalDate lastMonth = date.minusMonths(1); System.out.println("Last month: " + lastMonth); // Add using Period LocalDate nextYear = date.plus(Period.ofYears(1)); System.out.println("Next year: " + nextYear); // Add using ChronoUnit LocalDate decadeLater = date.plus(10, ChronoUnit.YEARS); System.out.println("Decade later: " + decadeLater); } }
此示例显示了使用 LocalDate 执行日期算术的各种方法。操作可以使用特定单位或 Period 对象。所有计算都会自动处理月份长度变化和闰年。
计算日期差
LocalDate 可以与 Period 一起使用来计算日期之间的差异。这对于确定年龄、持续时间或事件之间的时间跨度很有用。
package com.zetcode; import java.time.LocalDate; import java.time.Period; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) { LocalDate birthDate = LocalDate.of(1990, 5, 15); LocalDate today = LocalDate.now(); // Calculate period between dates Period age = Period.between(birthDate, today); System.out.printf("Age: %d years, %d months, %d days%n", age.getYears(), age.getMonths(), age.getDays()); // Calculate total days between dates long totalDays = ChronoUnit.DAYS.between(birthDate, today); System.out.println("Total days: " + totalDays); // Calculate months between dates long totalMonths = ChronoUnit.MONTHS.between(birthDate, today); System.out.println("Total months: " + totalMonths); } }
此示例演示了计算日期之间的差异。Period 提供了人类可读的组件,而 ChronoUnit 提供了特定单位的精确总数。这两种方法适用于不同的场景。
日期调整
LocalDate 支持使用 with
方法和 TemporalAdjusters 进行日期调整。这些允许设置特定日期字段或查找相对日期,如月初/月末日期。
package com.zetcode; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; public class Main { public static void main(String[] args) { LocalDate date = LocalDate.of(2025, 8, 15); // Set specific field LocalDate yearChanged = date.withYear(2030); System.out.println("Year changed: " + yearChanged); // First day of month LocalDate firstDay = date.with(TemporalAdjusters.firstDayOfMonth()); System.out.println("First day of month: " + firstDay); // Last day of year LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfYear()); System.out.println("Last day of year: " + lastDay); // Next Monday LocalDate nextMonday = date.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); System.out.println("Next Monday: " + nextMonday); } }
此示例显示了各种日期调整操作。TemporalAdjusters 提供了用于处理日期的常见操作。with
方法允许精确控制日期字段。
来源
在本文中,我们介绍了 Java LocalDate 类的基本方法和特性。理解这些概念对于在现代 Java 应用程序中进行准确的日期处理至关重要。
作者
列出所有Java教程。