ZetCode

Java JapaneseChronology类

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

java.time.chrono.JapaneseChronology类实现了日本皇历系统。它扩展了AbstractChronology类,并遵循日本使用的以年号为基础的日历。

这个历法基于日本年号系统,其中每个天皇的统治都定义了一个新的年号。当前的年号是令和,始于2019年5月1日。JapaneseChronology会自动处理所有年号的过渡。

JapaneseChronology 类概述

JapaneseChronology提供了创建日期、处理年号和执行日历计算的方法。它支持所有标准历法操作,同时实现了日本特有的规则。该类是不可变的且线程安全的。

public final class JapaneseChronology extends AbstractChronology {
    public static JapaneseChronology INSTANCE;
    public JapaneseDate date(int prolepticYear, int month, int dayOfMonth);
    public JapaneseDate date(Era era, int yearOfEra, int month, int dayOfMonth);
    public JapaneseDate dateNow();
    public JapaneseDate dateNow(ZoneId zone);
    public JapaneseDate dateNow(Clock clock);
    public JapaneseEra eraOf(int eraValue);
    public List<Era> eras();
    public String getCalendarType();
    public String getId();
    public boolean isLeapYear(long prolepticYear);
    public int prolepticYear(Era era, int yearOfEra);
    public ValueRange range(ChronoField field);
}

上面的代码展示了JapaneseChronology的关键方法。这些方法允许创建日本日期、处理年号和执行日历操作。该类为日本日历系统提供了全面支持。

创建日本日期

可以使用各种工厂方法创建日本日期。可以使用预推算年份或基于年号的年份来指定日期。历法会自动处理所有年号的过渡。

Main.java
package com.zetcode;

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

public class Main {

    public static void main(String[] args) {
        
        // Current date in Japanese calendar
        JapaneseDate today = JapaneseChronology.INSTANCE.dateNow();
        System.out.println("Today in Japanese calendar: " + today);
        
        // Specific date using proleptic year
        JapaneseDate date1 = JapaneseChronology.INSTANCE.date(2025, 4, 16);
        System.out.println("Date using proleptic year: " + date1);
        
        // Specific date using era and year of era
        JapaneseDate date2 = JapaneseChronology.INSTANCE.date(
            JapaneseEra.REIWA, 7, 4, 16);
        System.out.println("Date using era: " + date2);
        
        // Convert from LocalDate
        JapaneseDate date3 = JapaneseDate.from(LocalDate.of(2025, 4, 16));
        System.out.println("Converted from LocalDate: " + date3);
    }
}

此示例演示了创建JapaneseDate对象的不同方法。输出显示了日本日历格式的日期,包括年号。历法会自动处理所有年号计算。

使用日本年号

日本日历系统使用基于皇室统治的年号。JapaneseChronology提供了访问和使用这些年号的方法。每个年号都有一个数值和一个名称。

Main.java
package com.zetcode;

import java.time.chrono.JapaneseChronology;
import java.time.chrono.JapaneseEra;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        
        // Get all available eras
        List<JapaneseEra> eras = JapaneseChronology.INSTANCE.eras();
        System.out.println("Available Japanese eras:");
        eras.forEach(era -> System.out.println(era + ": " + era.getValue()));
        
        // Get specific era by value
        JapaneseEra heisei = JapaneseChronology.INSTANCE.eraOf(JapaneseEra.HEISEI.getValue());
        System.out.println("Heisei era: " + heisei);
        
        // Current era
        JapaneseEra currentEra = JapaneseDate.now().getEra();
        System.out.println("Current era: " + currentEra);
        
        // Era display name
        System.out.println("Reiwa display name: " + JapaneseEra.REIWA.getDisplayName(
            java.time.format.TextStyle.FULL, java.util.Locale.ENGLISH));
    }
}

此示例展示了如何使用日本年号。历法提供了对所有历史年号的访问。每个年号都有一个数值和以不同文本样式显示的名称。

日本日历中的日期计算

JapaneseChronology支持针对日本日历系统调整的标准日期计算。例如,添加天数或月数的操作会遵守年号边界和日历规则。

Main.java
package com.zetcode;

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

public class Main {

    public static void main(String[] args) {
        
        JapaneseDate date = JapaneseDate.of(JapaneseEra.REIWA, 5, 4, 16);
        System.out.println("Original date: " + date);
        
        // Add days
        JapaneseDate plusDays = date.plusDays(10);
        System.out.println("Plus 10 days: " + plusDays);
        
        // Add months (may cross era boundary)
        JapaneseDate plusMonths = date.plusMonths(15);
        System.out.println("Plus 15 months: " + plusMonths);
        
        // Add years (may cross era boundary)
        JapaneseDate plusYears = date.plusYears(3);
        System.out.println("Plus 3 years: " + plusYears);
        
        // Calculate days between dates
        JapaneseDate anotherDate = JapaneseDate.of(JapaneseEra.REIWA, 6, 1, 1);
        long daysBetween = ChronoUnit.DAYS.between(date, anotherDate);
        System.out.println("Days between: " + daysBetween);
    }
}

此示例演示了日本日历中的日期计算。操作遵守年号边界和日本日历规则。历法会自动处理所有特殊情况,例如年号过渡。

在日历之间转换

日本日期可以转换为其他日历系统,例如ISO,反之亦然。当使用国际系统时,这很有用,同时保留日本日历表示法。

Main.java
package com.zetcode;

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

public class Main {

    public static void main(String[] args) {
        
        // Convert from ISO to Japanese
        LocalDate isoDate = LocalDate.of(2025, 4, 16);
        JapaneseDate japaneseDate = JapaneseDate.from(isoDate);
        System.out.println("ISO to Japanese: " + japaneseDate);
        
        // Convert from Japanese to ISO
        JapaneseDate jDate = JapaneseDate.of(JapaneseEra.REIWA, 7, 4, 16);
        LocalDate isoDate2 = LocalDate.from(jDate);
        System.out.println("Japanese to ISO: " + isoDate2);
        
        // Conversion with era transition
        JapaneseDate heiseiDate = JapaneseDate.of(JapaneseEra.HEISEI, 31, 4, 30);
        LocalDate transitionDate = LocalDate.from(heiseiDate);
        System.out.println("Heisei to ISO: " + transitionDate);
        System.out.println("Converted back: " + JapaneseDate.from(transitionDate));
    }
}

此示例展示了日本和ISO日历系统之间的转换。转换正确处理年号过渡。请注意,2019年5月1日是从平成过渡到令和年号的日子。

闰年和验证

日本日历使用与格里高利历相同的闰年规则。JapaneseChronology提供了根据日本日历规则检查闰年和验证日期的方法。

Main.java
package com.zetcode;

import java.time.chrono.JapaneseChronology;
import java.time.chrono.JapaneseDate;

public class Main {

    public static void main(String[] args) {
        
        // Check leap year
        boolean isLeap2020 = JapaneseChronology.INSTANCE.isLeapYear(2020);
        System.out.println("Is 2020 a leap year? " + isLeap2020);
        
        // Valid date check
        try {
            JapaneseDate validDate = JapaneseDate.of(JapaneseEra.REIWA, 5, 2, 29);
            System.out.println("Valid date created: " + validDate);
        } catch (Exception e) {
            System.out.println("Invalid date: " + e.getMessage());
        }
        
        // Invalid date check
        try {
            JapaneseDate invalidDate = JapaneseDate.of(JapaneseEra.REIWA, 5, 2, 30);
            System.out.println(invalidDate);
        } catch (Exception e) {
            System.out.println("Invalid date: " + e.getMessage());
        }
        
        // Date range validation
        System.out.println("Maximum month length: " + 
            JapaneseChronology.INSTANCE.range(java.time.temporal.ChronoField.DAY_OF_MONTH));
    }
}

此示例演示了日本日历中的闰年检查和日期验证。历法遵循格里高利闰年规则。无效日期会抛出带有适当消息的DateTimeException

格式化日本日期

可以使用DateTimeFormatter与日本历法格式化日本日期。格式化程序可以以完整或缩写形式显示带有年号名称的日期。

Main.java
package com.zetcode;

import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;

public class Main {

    public static void main(String[] args) {
        
        JapaneseDate date = JapaneseDate.of(JapaneseEra.REIWA, 5, 4, 16);
        
        // Default formatting
        System.out.println("Default format: " + date);
        
        // Custom formatting
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("GGGG y年 M月 d日")
            .withChronology(JapaneseChronology.INSTANCE);
        System.out.println("Custom format: " + formatter1.format(date));
        
        // Localized formatting
        DateTimeFormatter formatter2 = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.FULL)
            .withLocale(Locale.JAPAN)
            .withChronology(JapaneseChronology.INSTANCE);
        System.out.println("Japanese format: " + formatter2.format(date));
        
        // English formatting
        DateTimeFormatter formatter3 = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.LONG)
            .withLocale(Locale.ENGLISH)
            .withChronology(JapaneseChronology.INSTANCE);
        System.out.println("English format: " + formatter3.format(date));
    }
}

此示例展示了格式化日本日期的不同方法。格式化程序可以以各种样式和语言环境显示日期。日本年号名称会根据指定的语言环境自动处理。

来源

Java JapaneseChronology类文档

在本文中,我们介绍了Java JapaneseChronology类的基本方法和特性。理解这些概念对于在Java应用程序中使用日本日历日期至关重要。

作者

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

列出所有Java教程