ZetCode

Java ChronoLocalDate 接口

最后修改时间:2025 年 4 月 16 日

java.time.chrono.ChronoLocalDate 接口表示在任意历法中没有时间或时区的日期。它是 Java 8 中引入的 Java 现代日期时间 API 的一部分。该接口与日历系统无关。

ChronoLocalDate 扩展了 TemporalComparable。它提供了跨不同日历系统进行日期操作和查询的方法。实现包括用于 ISO 日历的 LocalDate,以及其他日历系统(如日本或泰国)中的日期。

ChronoLocalDate 接口概述

该接口定义了所有日历系统通用的操作。关键方法包括日期运算、字段访问和比较。它通过实现支持前推和非前推日历系统。

public interface ChronoLocalDate extends Temporal, TemporalAdjuster, 
    Comparable<ChronoLocalDate> {
    Chronology getChronology();
    int getEraValue();
    boolean isLeapYear();
    int lengthOfMonth();
    int lengthOfYear();
    ChronoLocalDate plus(long amountToAdd, TemporalUnit unit);
    ChronoLocalDate minus(long amountToSubtract, TemporalUnit unit);
    long until(Temporal endExclusive, TemporalUnit unit);
    boolean isAfter(ChronoLocalDate other);
    boolean isBefore(ChronoLocalDate other);
    boolean isEqual(ChronoLocalDate other);
}

代码展示了 ChronoLocalDate 的关键方法。这些方法允许跨不同日历系统进行日期操作。无论底层历法如何,该接口都提供一致的操作。

创建 ChronoLocalDate 对象

通过特定于历法的实现创建 ChronoLocalDate 实例。ISO 日历使用 LocalDate,而其他日历使用其特定的日期类。通常使用工厂方法。

Main.java
package com.zetcode;

import java.time.LocalDate;
import java.time.chrono.HijrahDate;
import java.time.chrono.JapaneseDate;
import java.time.chrono.MinguoDate;
import java.time.chrono.ThaiBuddhistDate;

public class Main {

    public static void main(String[] args) {
        
        // ISO calendar date
        LocalDate isoDate = LocalDate.of(2025, 4, 15);
        System.out.println("ISO date: " + isoDate);
        
        // Japanese calendar date
        JapaneseDate japaneseDate = JapaneseDate.of(2025, 4, 15);
        System.out.println("Japanese date: " + japaneseDate);
        
        // Hijrah (Islamic) calendar date
        HijrahDate hijrahDate = HijrahDate.of(1446, 10, 17);
        System.out.println("Hijrah date: " + hijrahDate);
        
        // Thai Buddhist calendar date
        ThaiBuddhistDate thaiDate = ThaiBuddhistDate.of(2568, 4, 15);
        System.out.println("Thai date: " + thaiDate);
        
        // Minguo (Taiwan) calendar date
        MinguoDate minguoDate = MinguoDate.of(114, 4, 15);
        System.out.println("Minguo date: " + minguoDate);
    }
}

此示例在不同的日历系统中创建日期。每个日期类都实现了 ChronoLocalDate。输出显示根据其各自日历系统格式化的日期。

访问日期字段

ChronoLocalDate 提供了访问日期字段(如年、月和日)的方法。这些值是特定于日历系统的。该接口还提供了获取纪元和检查闰年的方法。

Main.java
package com.zetcode;

import java.time.chrono.JapaneseDate;
import java.time.chrono.JapaneseEra;

public class Main {

    public static void main(String[] args) {
        
        JapaneseDate jdate = JapaneseDate.of(JapaneseEra.REIWA, 7, 4, 15);
        
        System.out.println("Chronology: " + jdate.getChronology());
        System.out.println("Era: " + jdate.getEra());
        System.out.println("Year: " + jdate.getYear());
        System.out.println("Month: " + jdate.getMonthValue());
        System.out.println("Day: " + jdate.getDayOfMonth());
        System.out.println("Day of year: " + jdate.getDayOfYear());
        System.out.println("Leap year: " + jdate.isLeapYear());
        System.out.println("Month length: " + jdate.lengthOfMonth());
        System.out.println("Year length: " + jdate.lengthOfYear());
    }
}

此示例演示了访问日本日历日期的各种字段。这些值特定于日本日历系统。请注意纪元在某些日历系统中如何成为日期表示的重要组成部分。

日期比较

ChronoLocalDate 提供了跨不同日历系统比较日期的方法。比较基于日期的时态位置,而不是它们的日历特定表示形式。

Main.java
package com.zetcode;

import java.time.LocalDate;
import java.time.chrono.HijrahDate;
import java.time.chrono.JapaneseDate;

public class Main {

    public static void main(String[] args) {
        
        LocalDate isoDate = LocalDate.of(2025, 4, 15);
        JapaneseDate jdate = JapaneseDate.of(2025, 4, 15);
        HijrahDate hdate = HijrahDate.of(1446, 10, 17);
        
        System.out.println("ISO equals Japanese: " + isoDate.isEqual(jdate));
        System.out.println("ISO equals Hijrah: " + isoDate.isEqual(hdate));
        System.out.println("ISO before Hijrah: " + isoDate.isBefore(hdate));
        System.out.println("ISO after Japanese: " + isoDate.isAfter(jdate));
        
        // Compare across chronologies
        System.out.println("Comparison result: " + isoDate.compareTo(hdate));
    }
}

此示例比较了来自不同日历系统的日期。isEqual 方法对表示同一天的日期返回 true,无论日历系统如何。比较基于时态位置。

日期算术

ChronoLocalDate 支持日期运算操作,如添加或减去天、月或年。这些操作遵守特定日历系统的规则。

Main.java
package com.zetcode;

import java.time.LocalDate;
import java.time.chrono.HijrahDate;
import java.time.temporal.ChronoUnit;

public class Main {

    public static void main(String[] args) {
        
        HijrahDate hdate = HijrahDate.of(1446, 10, 17);
        System.out.println("Original Hijrah date: " + hdate);
        
        // Add days
        HijrahDate plusDays = hdate.plus(10, ChronoUnit.DAYS);
        System.out.println("Plus 10 days: " + plusDays);
        
        // Subtract months
        HijrahDate minusMonths = hdate.minus(2, ChronoUnit.MONTHS);
        System.out.println("Minus 2 months: " + minusMonths);
        
        // Add years
        HijrahDate plusYears = hdate.plus(1, ChronoUnit.YEARS);
        System.out.println("Plus 1 year: " + plusYears);
        
        // Using Period with ISO date
        LocalDate isoDate = LocalDate.of(2025, 4, 15);
        System.out.println("Original ISO date: " + isoDate);
        System.out.println("Plus 1 month: " + isoDate.plusMonths(1));
    }
}

此示例显示了对 Hijrah 和 ISO 日期的日期运算操作。这些操作遵守每个日历的规则。请注意,在每个日历系统中,月份长度和闰年的处理方式有所不同。

在日历之间转换

ChronoLocalDate 实现可以在不同的日历系统之间进行转换。转换保留时态位置,同时更改日历表示形式。

Main.java
package com.zetcode;

import java.time.LocalDate;
import java.time.chrono.HijrahDate;
import java.time.chrono.JapaneseDate;
import java.time.chrono.MinguoDate;

public class Main {

    public static void main(String[] args) {
        
        LocalDate isoDate = LocalDate.of(2025, 4, 15);
        System.out.println("ISO date: " + isoDate);
        
        // Convert to Japanese date
        JapaneseDate jdate = JapaneseDate.from(isoDate);
        System.out.println("Japanese date: " + jdate);
        
        // Convert to Hijrah date
        HijrahDate hdate = HijrahDate.from(isoDate);
        System.out.println("Hijrah date: " + hdate);
        
        // Convert to Minguo date
        MinguoDate mdate = MinguoDate.from(isoDate);
        System.out.println("Minguo date: " + mdate);
        
        // Convert back to ISO
        LocalDate backToIso = LocalDate.from(hdate);
        System.out.println("Back to ISO: " + backToIso);
    }
}

此示例演示了 ISO 与其他日历系统之间的转换。from 方法执行转换,同时保持相同的时态位置。转换是对称且无损的。

计算日期之间的期间

until 方法以指定的单位计算两个日期之间的期间。这适用于不同的日历系统,返回日期之间的时态距离。

Main.java
package com.zetcode;

import java.time.LocalDate;
import java.time.chrono.HijrahDate;
import java.time.chrono.JapaneseDate;
import java.time.temporal.ChronoUnit;

public class Main {

    public static void main(String[] args) {
        
        LocalDate date1 = LocalDate.of(2025, 1, 1);
        LocalDate date2 = LocalDate.of(2025, 4, 15);
        
        // Days between ISO dates
        long daysBetween = date1.until(date2, ChronoUnit.DAYS);
        System.out.println("Days between: " + daysBetween);
        
        // Months between ISO dates
        long monthsBetween = date1.until(date2, ChronoUnit.MONTHS);
        System.out.println("Months between: " + monthsBetween);
        
        // Days between different calendar systems
        HijrahDate hdate1 = HijrahDate.from(date1);
        JapaneseDate jdate2 = JapaneseDate.from(date2);
        long crossDays = hdate1.until(jdate2, ChronoUnit.DAYS);
        System.out.println("Cross-calendar days: " + crossDays);
    }
}

此示例显示了日期之间的期间计算。until 方法同时适用于相同日历和跨日历比较。结果表示日期之间的实际时态距离。

来源

Java ChronoLocalDate 接口文档

在本文中,我们介绍了 Java ChronoLocalDate 接口的基本方法和功能。了解这些概念对于在 Java 应用程序中使用不同日历系统处理日期至关重要。

作者

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

列出所有Java教程