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
的关键方法。这些方法允许创建日本日期、处理年号和执行日历操作。该类为日本日历系统提供了全面支持。
创建日本日期
可以使用各种工厂方法创建日本日期。可以使用预推算年份或基于年号的年份来指定日期。历法会自动处理所有年号的过渡。
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
提供了访问和使用这些年号的方法。每个年号都有一个数值和一个名称。
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
支持针对日本日历系统调整的标准日期计算。例如,添加天数或月数的操作会遵守年号边界和日历规则。
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,反之亦然。当使用国际系统时,这很有用,同时保留日本日历表示法。
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
提供了根据日本日历规则检查闰年和验证日期的方法。
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
与日本历法格式化日本日期。格式化程序可以以完整或缩写形式显示带有年号名称的日期。
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应用程序中使用日本日历日期至关重要。
作者
列出所有Java教程。