ZetCode

Java TemporalAccessor

最后修改时间:2025 年 3 月 6 日

在本文中,我们将探讨 Java 中的 TemporalAccessor 接口。我们将访问时间字段,检查支持的字段,并将其与 LocalTime 作为示例实现一起使用。

TemporalAccessor 是 ISO-8601 日历系统中 java.time 包中的一个基础接口。 它提供对时间对象(如时间或日期)的只读访问。

TemporalAccessor 由诸如 LocalTimeLocalDate 之类的类实现。 它是不可变的,并侧重于查询时间字段而不进行修改。

访问时间字段

使用 TemporalAccessor 通过 ChronoField 查询小时或分钟等字段。

Main.java
import java.time.LocalTime;
import java.time.temporal.ChronoField;

void main() {
    LocalTime time = LocalTime.now();
    int hour = time.get(ChronoField.HOUR_OF_DAY);
    System.out.println("Hour: " + hour);
}

这将检索当前小时。

该代码使用 LocalTime.now 创建一个包含当前时间的 LocalTime 对象。 然后,它使用带有 ChronoField.HOUR_OF_DAYget 来提取并打印小时。

检查支持的字段

isSupported 验证 TemporalAccessor 中是否提供某个字段。

Main.java
import java.time.LocalTime;
import java.time.temporal.ChronoField;

void main() {
    LocalTime time = LocalTime.of(15, 30);
    if (time.isSupported(ChronoField.MINUTE_OF_HOUR)) {
        int minute = time.get(ChronoField.MINUTE_OF_HOUR);
        System.out.println("Minute: " + minute);
    }
}

这将检查并检索分钟。

在此,LocalTime.of(15, 30) 设置特定时间。 isSupported 方法在 get 检索并打印分钟之前,检查 MINUTE_OF_HOUR 是否有效。

if (time.isSupported(ChronoField.MINUTE_OF_HOUR)) {

isSupported 确保字段在访问之前存在。

TemporalAccessor 与 LocalTime

LocalTime 实现了 TemporalAccessor。 比较它们的用法

Main.java
import java.time.LocalTime;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.ChronoField;

void main() {
    TemporalAccessor time = LocalTime.of(7, 20);
    int hour = time.get(ChronoField.HOUR_OF_DAY);
    System.out.println("Hour: " + hour);
}

这以通用方式使用 TemporalAccessor

此示例将 time 声明为 TemporalAccessor,显示其接口用法。 LocalTime.of(7, 20) 设置时间,get 使用 ChronoField 提取小时。

常见的时间字段

LocalTime 作为 TemporalAccessor 支持以下字段:

Main.java
import java.time.LocalTime;
import java.time.temporal.ChronoField;

void main() {
    LocalTime time = LocalTime.now();
    System.out.printf("Hour: %d%n", time.get(ChronoField.HOUR_OF_DAY));
    System.out.printf("Minute: %d%n", time.get(ChronoField.MINUTE_OF_HOUR));
    System.out.printf("Second: %d%n", time.get(ChronoField.SECOND_OF_MINUTE));
}

这会将时间拆分为组成部分。

该代码使用 LocalTime.now 获取当前时间。 然后,它使用 ChronoField 常量提取小时、分钟和秒,并通过 printf 以格式化的输出打印它们。

局限性

TemporalAccessor 是只读的。 对于调整,请使用 Temporal

Main.java
import java.time.LocalTime;

void main() {
    LocalTime time = LocalTime.now();
    LocalTime later = time.plusHours(3); // Requires Temporal
    System.out.println("Now: " + time);
    System.out.println("Later: " + later);
}

这演示了 TemporalAccessor 的一个限制。 虽然它可以查询字段,但像通过 plusHours 添加小时这样的修改需要 Temporal 接口,LocalTime 也实现了该接口。

来源

Java TemporalAccessor - 语言参考

在本文中,我们探讨了 Java TemporalAccessor

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程