Java IsoChronology 类
最后修改时间:2025 年 4 月 16 日
java.time.chrono.IsoChronology
类实现了 ISO 历法系统。这是 Java 日期和时间 API 中使用的默认历法。它遵循 ISO-8601 标准的规则。
IsoChronology
是不可变的并且是线程安全的。它定义了现代格里高利历法的规则。该历法根据 ISO 标准处理闰年和其他日历计算。
IsoChronology 类概述
IsoChronology
提供了创建日期、检查日历规则和执行转换的方法。它作为 Java 中大多数日期操作的基础。该类根据 ISO 处理所有日期计算。
public final class IsoChronology extends AbstractChronology { public static IsoChronology INSTANCE; public static boolean isLeapYear(long prolepticYear); public LocalDate date(int prolepticYear, int month, int dayOfMonth); public LocalDate dateYearDay(int prolepticYear, int dayOfYear); public LocalDate dateEpochDay(long epochDay); public LocalDate date(TemporalAccessor temporal); public int prolepticYear(Era era, int yearOfEra); public Era eraOf(int eraValue); public List<Era> eras(); }
以上代码显示了 IsoChronology
提供的关键方法。这些方法允许创建日期、检查闰年和处理纪元。该类遵循 ISO-8601 规则进行所有日历计算。
获取 ISO 历法实例
IsoChronology
是一个单例,通过其 INSTANCE
字段访问。此实例用于所有 ISO 日历操作。它也可以通过各种日期对象获得。
package com.zetcode; import java.time.chrono.IsoChronology; import java.time.LocalDate; public class Main { public static void main(String[] args) { // Get the ISO chronology instance IsoChronology isoChrono = IsoChronology.INSTANCE; System.out.println("ISO Chronology: " + isoChrono); // Get chronology from a date IsoChronology fromDate = LocalDate.now().getChronology(); System.out.println("From LocalDate: " + fromDate); // Compare chronologies System.out.println("Same instance: " + (isoChrono == fromDate)); } }
此示例演示了如何访问 IsoChronology
实例。输出确认了无论直接访问还是通过日期对象访问,它都是相同的实例。ISO 历法是大多数 Java 日期类型的默认值。
使用 IsoChronology 创建日期
IsoChronology
提供了几种创建日期的工厂方法。这些方法允许从不同的组件创建日期,例如年-月-日或年-日组合。
package com.zetcode; import java.time.chrono.IsoChronology; import java.time.LocalDate; public class Main { public static void main(String[] args) { IsoChronology iso = IsoChronology.INSTANCE; // Create date from year, month, day LocalDate date1 = iso.date(2025, 4, 15); System.out.println("Date from YMD: " + date1); // Create date from year and day of year LocalDate date2 = iso.dateYearDay(2025, 105); System.out.println("Date from year day: " + date2); // Create date from epoch day LocalDate date3 = iso.dateEpochDay(19000); System.out.println("Date from epoch day: " + date3); // Create from another temporal object LocalDate date4 = iso.date(date1); System.out.println("Date from temporal: " + date4); } }
此示例展示了使用 IsoChronology
创建日期的不同方法。这些方法在创建日期时提供了灵活性,同时确保所有日期都遵循 ISO 规则。历法验证所有日期组件。
检查闰年
isLeapYear
方法根据 ISO 规则检查某一年是否为闰年。这对于日历计算和日期验证很有用。该方法遵循标准的格里高利闰年规则。
package com.zetcode; import java.time.chrono.IsoChronology; public class Main { public static void main(String[] args) { IsoChronology iso = IsoChronology.INSTANCE; // Check some leap years System.out.println("2000 is leap: " + iso.isLeapYear(2000)); System.out.println("2020 is leap: " + iso.isLeapYear(2020)); System.out.println("2025 is leap: " + iso.isLeapYear(2025)); // Check edge cases System.out.println("1900 is leap: " + iso.isLeapYear(1900)); System.out.println("2100 is leap: " + iso.isLeapYear(2100)); } }
此示例演示了使用 IsoChronology
进行闰年检查。输出显示了可以被 100 整除的年份不是闰年,除非它们也可以被 400 整除。这与格里高利历法规则匹配。
使用纪元
ISO 历法支持两个纪元:公元前(当前纪元之前)和公元(当前纪元)。这些方法允许在纪元和推算年之间进行转换。在现代应用中,纪元处理很少需要。
package com.zetcode; import java.time.chrono.IsoChronology; import java.time.chrono.Era; public class Main { public static void main(String[] args) { IsoChronology iso = IsoChronology.INSTANCE; // Get all eras System.out.println("Available eras:"); for (Era era : iso.eras()) { System.out.println(era); } // Get era by value Era ce = iso.eraOf(1); System.out.println("Era of 1: " + ce); // Convert between eras and proleptic years int prolepticYear = iso.prolepticYear(ce, 2025); System.out.println("Proleptic year: " + prolepticYear); } }
此示例展示了 IsoChronology
中的纪元处理。ISO 系统使用一个简单的两纪元模型。大多数现代应用程序可以忽略纪元并直接使用推算年。
与其他历法的比较
IsoChronology
可以与其他历法实现进行比较。这在使用多个日历系统时很有用。比较包括检查历法 ID 和规则。
package com.zetcode; import java.time.chrono.IsoChronology; import java.time.chrono.JapaneseChronology; import java.time.chrono.HijrahChronology; public class Main { public static void main(String[] args) { IsoChronology iso = IsoChronology.INSTANCE; // Compare with other chronologies System.out.println("ISO vs Japanese: " + iso.equals(JapaneseChronology.INSTANCE)); System.out.println("ISO vs Hijrah: " + iso.equals(HijrahChronology.INSTANCE)); // Check chronology ID System.out.println("ISO ID: " + iso.getId()); System.out.println("Japanese ID: " + JapaneseChronology.INSTANCE.getId()); } }
此示例将 IsoChronology
与其他日历系统进行比较。输出显示了不同的历法如何具有唯一的 ID 和规则。ISO 历法是大多数 Java 应用程序中的默认值。
使用 IsoChronology 进行日期计算
IsoChronology
提供了用于高级日期计算的方法。这些包括范围检查、月份长度和其他特定于日历的操作。所有计算都遵循 ISO 规则。
package com.zetcode; import java.time.chrono.IsoChronology; import java.time.LocalDate; import java.time.chrono.ChronoLocalDate; import java.time.temporal.ChronoField; public class Main { public static void main(String[] args) { IsoChronology iso = IsoChronology.INSTANCE; LocalDate date = iso.date(2025, 2, 15); // Get month length System.out.println("Days in month: " + iso.range(ChronoField.DAY_OF_MONTH).getMaximum()); // Get year length System.out.println("Days in year: " + iso.range(ChronoField.DAY_OF_YEAR).getMaximum()); // Check date validity System.out.println("Is valid year: " + iso.isValidYear(2025)); System.out.println("Is valid date: " + iso.isValidYearDay(2025, 366)); } }
此示例演示了使用 IsoChronology
进行日期计算。这些方法提供了有关日期范围和有效性的信息。这些对于构建日历应用程序或执行日期验证很有用。
来源
在本文中,我们涵盖了 Java IsoChronology 类的基本方法和功能。理解这些概念对于使用 ISO 历法系统中的日期至关重要。
作者
列出所有Java教程。