Java ChronoLocalDate 接口
最后修改时间:2025 年 4 月 16 日
java.time.chrono.ChronoLocalDate
接口表示在任意历法中没有时间或时区的日期。它是 Java 8 中引入的 Java 现代日期时间 API 的一部分。该接口与日历系统无关。
ChronoLocalDate
扩展了 Temporal
和 Comparable
。它提供了跨不同日历系统进行日期操作和查询的方法。实现包括用于 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
,而其他日历使用其特定的日期类。通常使用工厂方法。
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
提供了访问日期字段(如年、月和日)的方法。这些值是特定于日历系统的。该接口还提供了获取纪元和检查闰年的方法。
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
提供了跨不同日历系统比较日期的方法。比较基于日期的时态位置,而不是它们的日历特定表示形式。
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
支持日期运算操作,如添加或减去天、月或年。这些操作遵守特定日历系统的规则。
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
实现可以在不同的日历系统之间进行转换。转换保留时态位置,同时更改日历表示形式。
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
方法以指定的单位计算两个日期之间的期间。这适用于不同的日历系统,返回日期之间的时态距离。
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 应用程序中使用不同日历系统处理日期至关重要。
作者
列出所有Java教程。