Java ChronoUnit 枚举
最后修改时间:2025 年 4 月 16 日
java.time.temporal.ChronoUnit
枚举表示标准的时间度量单位。它为 Java Time API 提供了从纳秒到世纪的单位。ChronoUnit 实现了 TemporalUnit
接口。
ChronoUnit
用于时间算术和日期时间计算。它与 Instant
、LocalDate
和 ZonedDateTime
等类一起使用。该枚举提供了基于时间和基于日期的单位。
ChronoUnit 枚举概述
ChronoUnit
包含各种时间单位的常量。每个单位都有一个持续时间和用于时间计算的方法。该枚举一致地处理小的 时间单位和大的基于日期的单位。
public enum ChronoUnit implements TemporalUnit { NANOS, MICROS, MILLIS, SECONDS, MINUTES, HOURS, HALF_DAYS, DAYS, WEEKS, MONTHS, YEARS, DECADES, CENTURIES, MILLENNIA, ERAS, FOREVER; public boolean isDateBased(); public boolean isTimeBased(); public Duration getDuration(); public boolean isSupportedBy(Temporal temporal); public <R extends Temporal> R addTo(R temporal, long amount); }
上面的代码显示了 ChronoUnit
中的关键方法和常量。该枚举提供了从纳秒到千年的单位。每个单位都可用于从时间对象中添加/减去时间。
ChronoUnit 的基本用法
ChronoUnit 常量可以直接用于时间计算。最简单的用法涉及从时间对象中添加或减去单位。这提供了对日期时间操作的精确控制。
package com.zetcode; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) { LocalDateTime now = LocalDateTime.now(); System.out.println("Current time: " + now); // Add 5 hours LocalDateTime later = now.plus(5, ChronoUnit.HOURS); System.out.println("5 hours later: " + later); // Subtract 3 days LocalDateTime earlier = now.minus(3, ChronoUnit.DAYS); System.out.println("3 days earlier: " + earlier); // Add 30 minutes LocalDateTime soon = now.plus(30, ChronoUnit.MINUTES); System.out.println("30 minutes later: " + soon); } }
此示例演示了 ChronoUnit 的基本算术运算。我们从当前日期时间添加和减去不同的时间单位。这些操作正确地维护了所有日期时间字段,并自动处理溢出。
计算时间差
ChronoUnit 可以计算时间对象之间的差异。between
方法返回指定单位的时间量。这对于测量事件之间的持续时间很有用。
package com.zetcode; import java.time.LocalDate; import java.time.LocalTime; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) { LocalDate date1 = LocalDate.of(2025, 1, 1); LocalDate date2 = LocalDate.of(2025, 12, 31); // Days between dates long daysBetween = ChronoUnit.DAYS.between(date1, date2); System.out.println("Days between: " + daysBetween); // Months between dates long monthsBetween = ChronoUnit.MONTHS.between(date1, date2); System.out.println("Months between: " + monthsBetween); LocalTime time1 = LocalTime.of(8, 30); LocalTime time2 = LocalTime.of(17, 45); // Hours between times long hoursBetween = ChronoUnit.HOURS.between(time1, time2); System.out.println("Hours between: " + hoursBetween); // Minutes between times long minsBetween = ChronoUnit.MINUTES.between(time1, time2); System.out.println("Minutes between: " + minsBetween); } }
此示例展示了如何使用各种 ChronoUnit 值计算日期和时间之间的差异。该方法返回两个时间对象之间指定单位的完整计数。
检查单位支持
并非所有时间对象都支持所有 ChronoUnit 值。isSupportedBy
方法检查一个单位是否可以与特定的时间对象一起使用。这可以防止运行时不支持的操作。
package com.zetcode; import java.time.LocalDate; import java.time.LocalTime; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) { LocalDate date = LocalDate.now(); LocalTime time = LocalTime.now(); // Check date-based units System.out.println("DAYS supported by date: " + ChronoUnit.DAYS.isSupportedBy(date)); System.out.println("HOURS supported by date: " + ChronoUnit.HOURS.isSupportedBy(date)); // Check time-based units System.out.println("HOURS supported by time: " + ChronoUnit.HOURS.isSupportedBy(time)); System.out.println("MONTHS supported by time: " + ChronoUnit.MONTHS.isSupportedBy(time)); // Check mixed units System.out.println("WEEKS supported by date: " + ChronoUnit.WEEKS.isSupportedBy(date)); System.out.println("NANOS supported by time: " + ChronoUnit.NANOS.isSupportedBy(time)); } }
此示例演示了检查不同时间类型的单位支持。基于日期的对象通常不支持时间单位,反之亦然。该方法有助于编写安全处理时间操作的稳健代码。
使用 Instant
ChronoUnit 与 Instant 配合使用时,在精确的时间计算方面表现出色。Instant 支持所有基于时间的单位,但不支持基于日期的单位。这使其成为机器时间操作的理想选择。
package com.zetcode; import java.time.Instant; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) throws InterruptedException { Instant start = Instant.now(); Thread.sleep(1500); // Simulate work Instant end = Instant.now(); // Calculate duration in various units System.out.println("Nanos between: " + ChronoUnit.NANOS.between(start, end)); System.out.println("Millis between: " + ChronoUnit.MILLIS.between(start, end)); System.out.println("Seconds between: " + ChronoUnit.SECONDS.between(start, end)); // Add time to instant Instant future = start.plus(2, ChronoUnit.HOURS) .plus(30, ChronoUnit.MINUTES); System.out.println("Future time: " + future); } }
此示例展示了 ChronoUnit 与 Instant 的用法。我们以不同的精度单位测量时间间隔并执行时间算术。Instant 提供纳秒精度(如果可用)。
基于日期的计算
对于基于日期的计算,ChronoUnit 提供了诸如天、周和月之类的单位。这些单位考虑了日历规则,例如不同的月份长度。这些计算保持了日历的正确性。
package com.zetcode; import java.time.LocalDate; import java.time.Month; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) { LocalDate today = LocalDate.now(); System.out.println("Today: " + today); // Add weeks LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); System.out.println("Next week: " + nextWeek); // Subtract months LocalDate lastMonth = today.minus(1, ChronoUnit.MONTHS); System.out.println("Last month: " + lastMonth); // Complex calculation LocalDate futureDate = today.plus(2, ChronoUnit.YEARS) .minus(3, ChronoUnit.MONTHS); System.out.println("Future date: " + futureDate); // Days in February 2024 (leap year) LocalDate feb1 = LocalDate.of(2024, Month.FEBRUARY, 1); long daysInFeb = ChronoUnit.DAYS.between(feb1, feb1.plus(1, ChronoUnit.MONTHS)); System.out.println("Days in Feb 2024: " + daysInFeb); } }
此示例演示了使用 ChronoUnit 的基于日期的计算。这些操作遵守日历规则,包括闰年和不同的月份长度。结果始终是日历正确的。
组合时间和日期单位
ChronoUnit 允许在计算中组合时间和日期单位。这对于复杂的时间操作很有用。这些操作按顺序应用,并进行适当的单位转换。
package com.zetcode; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) { LocalDateTime now = LocalDateTime.now(); System.out.println("Now: " + now); // Mixed unit calculation LocalDateTime complex = now.plus(2, ChronoUnit.DAYS) .plus(3, ChronoUnit.HOURS) .minus(45, ChronoUnit.MINUTES); System.out.println("Complex result: " + complex); // Calculate weeks between dates LocalDateTime future = now.plus(10, ChronoUnit.WEEKS); long weeksBetween = ChronoUnit.WEEKS.between(now, future); System.out.println("Weeks between: " + weeksBetween); // Check if unit is time or date based System.out.println("HOURS is time-based: " + ChronoUnit.HOURS.isTimeBased()); System.out.println("MONTHS is date-based: " + ChronoUnit.MONTHS.isDateBased()); } }
此示例展示了在计算中组合时间和日期单位。我们还检查了单位是基于时间还是基于日期。这些操作在不同的单位类型之间保持时间的一致性。
来源
在本文中,我们介绍了 Java ChronoUnit 枚举的基本方法和功能。理解这些概念对于在 Java 应用程序中进行精确的时间和日期计算至关重要。
作者
列出所有Java教程。