Java ChronoZonedDateTime 接口
最后修改时间:2025 年 4 月 16 日
java.time.chrono.ChronoZonedDateTime
接口表示在任意历法中带有时区的日期时间。它将时间信息与时区规则相结合。该接口扩展了 Comparable
和 Temporal
。
ChronoZonedDateTime
是不可变的且线程安全的。它根据特定日历系统的规则处理日期时间计算。该接口通过历法机制支持 ISO 和非 ISO 日历系统。
ChronoZonedDateTime 接口概述
该接口提供了访问日期时间字段、执行计算以及在时区之间转换的方法。它结合了历法、本地日期时间及时区信息。所有实现都必须是不可变的并且是线程安全的。
public interface ChronoZonedDateTime<D extends ChronoLocalDate> extends Comparable<ChronoZonedDateTime<?>>, Temporal { ZoneId getZone(); ChronoLocalDateTime<D> toLocalDateTime(); Chronology getChronology(); boolean isBefore(ChronoZonedDateTime<?> other); boolean isAfter(ChronoZonedDateTime<?> other); ChronoZonedDateTime<D> withZoneSameInstant(ZoneId zone); ChronoZonedDateTime<D> withZoneSameLocal(ZoneId zone); long toEpochSecond(); Instant toInstant(); }
以上代码展示了 ChronoZonedDateTime
的关键方法。这些方法允许在不同的日历系统中处理日期时间值。该接口提供精确到纳秒的精度,并具有时区感知能力。
创建 ChronoZonedDateTime 对象
ChronoZonedDateTime 对象通常通过工厂方法创建。最常用的方法是使用 ZonedDateTime
,它为 ISO 日历系统实现了此接口。
package com.zetcode; import java.time.ZonedDateTime; import java.time.ZoneId; import java.time.chrono.ChronoZonedDateTime; public class Main { public static void main(String[] args) { // Current date-time with timezone ChronoZonedDateTime<?> now = ZonedDateTime.now(); System.out.println("Current zoned date-time: " + now); // Specific date-time with timezone ChronoZonedDateTime<?> specific = ZonedDateTime.of( 2025, 6, 15, 14, 30, 0, 0, ZoneId.of("Europe/Paris")); System.out.println("Specific zoned date-time: " + specific); // From string ChronoZonedDateTime<?> parsed = ZonedDateTime.parse( "2025-01-01T12:00:00+01:00[Europe/Berlin]"); System.out.println("Parsed zoned date-time: " + parsed); } }
此示例演示了创建 ChronoZonedDateTime 对象的不同方法。输出显示了带有时区信息的日期时间值。所有示例都通过 ZonedDateTime 实现使用 ISO 日历系统。
访问日期时间组件
ChronoZonedDateTime 提供了访问其组件(包括日期、时间和时区)的方法。这些方法允许检查完整的时态状态。这些值特定于所使用的历法。
package com.zetcode; import java.time.ZonedDateTime; import java.time.chrono.ChronoZonedDateTime; public class Main { public static void main(String[] args) { ChronoZonedDateTime<?> zdt = ZonedDateTime.now(); System.out.println("Chronology: " + zdt.getChronology()); System.out.println("Zone: " + zdt.getZone()); System.out.println("Year: " + zdt.getYear()); System.out.println("Month: " + zdt.getMonth()); System.out.println("Day: " + zdt.getDayOfMonth()); System.out.println("Hour: " + zdt.getHour()); System.out.println("Minute: " + zdt.getMinute()); // Local date-time without timezone System.out.println("Local date-time: " + zdt.toLocalDateTime()); } }
此示例展示了如何访问 ChronoZonedDateTime 的各种组件。getChronology
方法返回正在使用的日历系统。所有时态字段都通过标准 getter 方法访问。
时区转换
ChronoZonedDateTime 支持在时区之间转换,同时保留瞬间或本地时间。这些操作对于需要以不同地区显示时间的全球应用程序至关重要。
package com.zetcode; import java.time.ZonedDateTime; import java.time.ZoneId; import java.time.chrono.ChronoZonedDateTime; public class Main { public static void main(String[] args) { ChronoZonedDateTime<?> nyTime = ZonedDateTime.now(ZoneId.of("America/New_York")); System.out.println("New York time: " + nyTime); // Convert to Tokyo time (same instant) ChronoZonedDateTime<?> tokyoTime = nyTime.withZoneSameInstant(ZoneId.of("Asia/Tokyo")); System.out.println("Tokyo time (same instant): " + tokyoTime); // Convert to London time (same local time) ChronoZonedDateTime<?> londonTime = nyTime.withZoneSameLocal(ZoneId.of("Europe/London")); System.out.println("London time (same local time): " + londonTime); } }
此示例演示了 ChronoZonedDateTime 的时区转换。withZoneSameInstant
更改时区,同时保持相同的瞬间。withZoneSameLocal
保留本地时间,但更改时区,从而产生不同的瞬间。
比较 ChronoZonedDateTime
ChronoZonedDateTime 实例可以按时间顺序进行比较。比较考虑了时间和历法。不同的日历系统可以通过其等效的瞬间进行比较。
package com.zetcode; import java.time.ZonedDateTime; import java.time.ZoneId; import java.time.chrono.ChronoZonedDateTime; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) { ChronoZonedDateTime<?> now = ZonedDateTime.now(); ChronoZonedDateTime<?> future = now.plus(1, ChronoUnit.HOURS); ChronoZonedDateTime<?> past = now.minus(30, ChronoUnit.MINUTES); System.out.println("Now is before future: " + now.isBefore(future)); System.out.println("Now is after past: " + now.isAfter(past)); System.out.println("Comparison result: " + now.compareTo(future)); // Equality considers both chronology and instant ChronoZonedDateTime<?> copy = ZonedDateTime.from(now); System.out.println("Now equals copy: " + now.equals(copy)); } }
此示例展示了比较 ChronoZonedDateTime 对象的各种方法。比较方法考虑了瞬间和历法。请注意,相等性要求历法和瞬间完全匹配。
转换为 Instant 和纪元秒
ChronoZonedDateTime 可以转换为 Instant 和纪元秒,以便与其他时间表示进行互操作。当使用需要机器时间表示的 API 时,这些转换非常有用。
package com.zetcode; import java.time.ZonedDateTime; import java.time.chrono.ChronoZonedDateTime; public class Main { public static void main(String[] args) { ChronoZonedDateTime<?> zdt = ZonedDateTime.now(); // Convert to Instant System.out.println("As Instant: " + zdt.toInstant()); // Convert to epoch seconds System.out.println("Epoch seconds: " + zdt.toEpochSecond()); // Convert from Instant back to ChronoZonedDateTime ChronoZonedDateTime<?> fromInstant = ZonedDateTime.ofInstant(zdt.toInstant(), zdt.getZone()); System.out.println("From Instant: " + fromInstant); } }
此示例演示了 ChronoZonedDateTime 和 Instant 之间的转换。toInstant
方法转换为绝对时间点。toEpochSecond
提供了自 1970-01-01T00:00:00Z 以来秒的计数。
使用不同的历法
ChronoZonedDateTime 通过历法机制支持非 ISO 日历系统。这允许在不同的文化日历系统中处理日期时间,同时保持时区感知能力。
package com.zetcode; import java.time.ZoneId; import java.time.chrono.HijrahChronology; import java.time.chrono.JapaneseChronology; import java.time.chrono.ChronoZonedDateTime; import java.time.LocalDateTime; public class Main { public static void main(String[] args) { // Japanese calendar ChronoZonedDateTime<?> japaneseDate = JapaneseChronology.INSTANCE .zonedDateTime(LocalDateTime.now(), ZoneId.systemDefault()); System.out.println("Japanese date-time: " + japaneseDate); // Hijrah (Islamic) calendar ChronoZonedDateTime<?> hijrahDate = HijrahChronology.INSTANCE .zonedDateTime(LocalDateTime.now(), ZoneId.of("Asia/Riyadh")); System.out.println("Hijrah date-time: " + hijrahDate); // Comparing across chronologies System.out.println("Same instant: " + japaneseDate.toInstant().equals(hijrahDate.toInstant())); } }
此示例展示了带有非 ISO 日历系统的 ChronoZonedDateTime。使用日本和伊斯兰历法创建日期时间值。尽管日历系统不同,但它们可以通过它们的瞬间值进行比较。
来源
在本文中,我们介绍了 Java ChronoZonedDateTime 接口的基本方法和特性。理解这些概念对于跨不同日历系统和时区处理日期时间值至关重要。
作者
列出所有Java教程。