Java ChronoPeriod 接口
最后修改时间:2025 年 4 月 16 日
java.time.chrono.ChronoPeriod
接口表示 ISO-8601 日历系统中基于日期的时间量。它将一段时间建模为年、月和日的组合。ChronoPeriod 用于基于日期的计算。
ChronoPeriod
是不可变的和线程安全的。它与 ChronoLocalDate
实现一起工作。该接口提供了从日期添加或减去周期的方法。它支持不同的日历系统。
ChronoPeriod 接口概述
ChronoPeriod
扩展了 TemporalAmount
并提供了获取周期组件的方法。关键操作包括添加到日期、比较周期和转换为其他格式。该接口处理以年、月和日为单位的周期。
public interface ChronoPeriod extends TemporalAmount { long get(TemporalUnit unit); List<TemporalUnit> getUnits(); ChronoPeriod plus(TemporalAmount amountToAdd); ChronoPeriod minus(TemporalAmount amountToSubtract); ChronoPeriod multipliedBy(int scalar); ChronoPeriod negated(); ChronoPeriod normalized(); boolean isZero(); boolean isNegative(); Chronology getChronology(); }
上面的代码显示了 ChronoPeriod
提供的关键方法。这些方法允许创建、比较和操作周期。该接口支持不同日历系统的操作。
创建 ChronoPeriod 对象
ChronoPeriod 对象通常使用 Period
类的工厂方法创建。 between
方法计算两个日期之间的周期。也支持从字符串解析。
package com.zetcode; import java.time.LocalDate; import java.time.Period; import java.time.chrono.ChronoPeriod; public class Main { public static void main(String[] args) { // Create from factory method ChronoPeriod period1 = Period.of(2, 3, 10); System.out.println("Period 1: " + period1); // Calculate between dates LocalDate start = LocalDate.of(2020, 1, 1); LocalDate end = LocalDate.of(2025, 4, 15); ChronoPeriod period2 = Period.between(start, end); System.out.println("Period between dates: " + period2); // Parse from string ChronoPeriod period3 = Period.parse("P1Y2M15D"); System.out.println("Parsed period: " + period3); } }
此示例演示了创建 ChronoPeriod 对象的不同方法。输出显示人类可读格式的周期。 between
方法计算两个日期之间的确切周期。
获取周期组件
ChronoPeriod 可以分解为年、月和日组件。这些值表示每个单位的时间量。这些方法对于显示或处理周期信息很有用。
package com.zetcode; import java.time.Period; import java.time.chrono.ChronoPeriod; public class Main { public static void main(String[] args) { ChronoPeriod period = Period.of(3, 8, 25); // Get individual components System.out.println("Years: " + period.getYears()); System.out.println("Months: " + period.getMonths()); System.out.println("Days: " + period.getDays()); // Get using TemporalUnit System.out.println("Total months: " + period.get(java.time.temporal.ChronoUnit.MONTHS)); } }
此示例展示了如何从 ChronoPeriod 中提取组件。带有 TemporalUnit
的 get
方法提供了对周期组件的灵活访问。请注意,月份和年份没有标准化。
添加和减去周期
ChronoPeriod 通过 plus
和 minus
方法支持时间算术。这些操作对于计算未来或过去的周期很有用。这些操作维护单独的年、月、日组件。
package com.zetcode; import java.time.Period; import java.time.chrono.ChronoPeriod; public class Main { public static void main(String[] args) { ChronoPeriod period1 = Period.of(1, 2, 15); ChronoPeriod period2 = Period.of(0, 5, 10); // Add periods ChronoPeriod added = period1.plus(period2); System.out.println("Added periods: " + added); // Subtract periods ChronoPeriod subtracted = period1.minus(period2); System.out.println("Subtracted periods: " + subtracted); // Add to date java.time.LocalDate date = java.time.LocalDate.now(); System.out.println("Date plus period: " + date.plus(period1)); } }
此示例显示了使用 ChronoPeriod 执行算术运算的各种方法。操作可以组合周期或将它们应用于日期。请注意,组件是单独添加的,没有标准化。
乘法和取反周期
ChronoPeriod 提供了 multipliedBy
和 negated
方法来缩放周期。这些操作对于重复模式或反转周期方向很有用。
package com.zetcode; import java.time.Period; import java.time.chrono.ChronoPeriod; public class Main { public static void main(String[] args) { ChronoPeriod period = Period.of(1, 3, 10); // Multiply period ChronoPeriod multiplied = period.multipliedBy(3); System.out.println("Multiplied period: " + multiplied); // Negate period ChronoPeriod negated = period.negated(); System.out.println("Negated period: " + negated); // Normalize period ChronoPeriod normalized = Period.of(0, 15, 40).normalized(); System.out.println("Normalized period: " + normalized); } }
此示例演示了使用 ChronoPeriod 的缩放操作。 normalized
方法将多余的月份转换为年份。 请注意,在标准化期间,天数不会转换为月份。
比较周期
ChronoPeriod 可以使用 isZero
、isNegative
和相等性检查进行比较。这些比较对于验证周期或检查空周期至关重要。
package com.zetcode; import java.time.Period; import java.time.chrono.ChronoPeriod; public class Main { public static void main(String[] args) { ChronoPeriod period1 = Period.of(0, 0, 0); ChronoPeriod period2 = Period.of(1, -2, 5); ChronoPeriod period3 = Period.of(1, 2, 5); System.out.println("Is period1 zero: " + period1.isZero()); System.out.println("Is period2 negative: " + period2.isNegative()); System.out.println("Are periods equal: " + period2.negated().equals(period3)); } }
此示例演示了比较 ChronoPeriod 对象的各种方法。 比较方法检查单个组件。 请注意,相等性需要所有组件的完全匹配。
使用不同的年表
ChronoPeriod 通过其 getChronology
方法支持不同的日历系统。这允许使用非 ISO 日历,例如日本或泰国佛教日历。
package com.zetcode; import java.time.chrono.HijrahChronology; import java.time.chrono.JapaneseChronology; import java.time.chrono.ChronoPeriod; import java.time.Period; public class Main { public static void main(String[] args) { ChronoPeriod isoPeriod = Period.of(1, 2, 15); System.out.println("ISO chronology: " + isoPeriod.getChronology()); // Create period with different chronology ChronoPeriod hijrahPeriod = HijrahChronology.INSTANCE.period(1, 2, 15); System.out.println("Hijrah chronology: " + hijrahPeriod.getChronology()); // Convert between chronologies LocalDate isoDate = LocalDate.now(); LocalDate hijrahDate = HijrahChronology.INSTANCE.date(isoDate); ChronoPeriod convertedPeriod = Period.between( hijrahDate, hijrahDate.plus(hijrahPeriod) ); System.out.println("Converted period: " + convertedPeriod); } }
此示例展示了使用 ChronoPeriod 处理不同日历系统的方法。 该接口在各种年表中提供一致的操作。 请注意,日历之间的转换可能会产生不同的结果。
来源
在本文中,我们介绍了 Java ChronoPeriod 接口的基本方法和功能。 了解这些概念对于现代 Java 应用程序中基于日期的计算至关重要。
作者
列出所有Java教程。