ZetCode

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 日历操作。它也可以通过各种日期对象获得。

Main.java
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 提供了几种创建日期的工厂方法。这些方法允许从不同的组件创建日期,例如年-月-日或年-日组合。

Main.java
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 规则检查某一年是否为闰年。这对于日历计算和日期验证很有用。该方法遵循标准的格里高利闰年规则。

Main.java
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 历法支持两个纪元:公元前(当前纪元之前)和公元(当前纪元)。这些方法允许在纪元和推算年之间进行转换。在现代应用中,纪元处理很少需要。

Main.java
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 和规则。

Main.java
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 规则。

Main.java
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 类文档

在本文中,我们涵盖了 Java IsoChronology 类的基本方法和功能。理解这些概念对于使用 ISO 历法系统中的日期至关重要。

作者

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

列出所有Java教程