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教程。