ZetCode

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 获取当前日期,以及使用工厂方法创建特定日期。也支持从字符串解析。

Main.java
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 方法访问这些值。该类提供了基于数字和枚举的访问方式。

Main.java
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 对象以确定时间顺序。该类提供了 isBeforeisAftercompareTo 方法。这些比较对于基于日期的逻辑至关重要。

Main.java
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 通过 plusminus 方法支持日期算术。这些操作对于计算未来或过去的日期很有用。该类正确处理月份和年份的边界。

Main.java
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 一起使用来计算日期之间的差异。这对于确定年龄、持续时间或事件之间的时间跨度很有用。

Main.java
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 进行日期调整。这些允许设置特定日期字段或查找相对日期,如月初/月末日期。

Main.java
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 LocalDate 类的基本方法和特性。理解这些概念对于在现代 Java 应用程序中进行准确的日期处理至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员,在该领域拥有多年经验。我从 2007 年开始撰写编程文章,至今已撰写了 1400 多篇文章和八本电子书。凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程