Java ChronoLocalDateTime 接口
最后修改时间:2025 年 4 月 16 日
java.time.chrono.ChronoLocalDateTime
接口表示在任意历法中没有时区的日期时间。它是不同日历系统中日期时间对象的基本接口。
ChronoLocalDateTime
结合了日期和时间组件,同时独立于时区。它支持 ISO-8601 之外的各种日历系统。该接口是不可变的且线程安全的。
ChronoLocalDateTime 概述
ChronoLocalDateTime
提供了日期时间操作、比较和格式化的方法。它与 Chronology
一起工作,以支持不同的日历系统。该接口扩展了 Temporal
和 Comparable
。
public interface ChronoLocalDateTime<D extends ChronoLocalDate> extends Temporal, TemporalAdjuster, Comparable<ChronoLocalDateTime<?>> { Chronology getChronology(); D toLocalDate(); LocalTime toLocalTime(); boolean isAfter(ChronoLocalDateTime<?> other); boolean isBefore(ChronoLocalDateTime<?> other); boolean isEqual(ChronoLocalDateTime<?> other); String format(DateTimeFormatter formatter); ChronoZonedDateTime<D> atZone(ZoneId zone); }
代码展示了 ChronoLocalDateTime
的关键方法。这些方法允许在不同的日历系统中处理日期时间值。该接口提供精确到纳秒的精度。
创建 ChronoLocalDateTime 对象
ChronoLocalDateTime 对象通常通过 JapaneseDate
或 HijrahDate
等实现来创建。ISO 日历系统使用 LocalDateTime
。
package com.zetcode; import java.time.LocalDateTime; import java.time.chrono.HijrahDate; import java.time.chrono.JapaneseDate; import java.time.chrono.MinguoDate; import java.time.chrono.ThaiBuddhistDate; public class Main { public static void main(String[] args) { // ISO calendar system LocalDateTime isoDateTime = LocalDateTime.now(); System.out.println("ISO DateTime: " + isoDateTime); // Japanese calendar system JapaneseDate japaneseDate = JapaneseDate.now(); LocalDateTime japaneseTime = LocalDateTime.now(); ChronoLocalDateTime<JapaneseDate> japaneseDateTime = JapaneseDate.from(japaneseDate).atTime(japaneseTime.toLocalTime()); System.out.println("Japanese DateTime: " + japaneseDateTime); // Hijrah calendar system HijrahDate hijrahDate = HijrahDate.now(); ChronoLocalDateTime<HijrahDate> hijrahDateTime = hijrahDate.atTime(LocalDateTime.now().toLocalTime()); System.out.println("Hijrah DateTime: " + hijrahDateTime); } }
此示例演示了在不同的日历系统中创建 ChronoLocalDateTime
对象。每个系统将其特定的日期与标准本地时间相结合。输出显示了它们各自日历中的日期时间值。
比较 ChronoLocalDateTime 对象
ChronoLocalDateTime 支持跨不同日历系统的比较操作。比较基于时间轴上的同一时刻。
package com.zetcode; import java.time.LocalDateTime; import java.time.chrono.ChronoLocalDateTime; import java.time.chrono.JapaneseDate; public class Main { public static void main(String[] args) { LocalDateTime isoDateTime = LocalDateTime.now(); ChronoLocalDateTime<JapaneseDate> japaneseDateTime = JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime()); System.out.println("ISO DateTime: " + isoDateTime); System.out.println("Japanese DateTime: " + japaneseDateTime); // Comparison System.out.println("Is ISO after Japanese: " + isoDateTime.isAfter(japaneseDateTime)); System.out.println("Is ISO before Japanese: " + isoDateTime.isBefore(japaneseDateTime)); System.out.println("Is ISO equal to Japanese: " + isoDateTime.isEqual(japaneseDateTime)); } }
此示例比较了来自不同日历系统的日期时间值。比较方法在比较之前将两个值转换为同一时刻。请注意,isEqual
检查的是同一时刻,而不是相同的显示。
格式化 ChronoLocalDateTime
ChronoLocalDateTime 可以使用 DateTimeFormatter
进行格式化。格式化程序尊重正在格式化的日期时间值的历法。
package com.zetcode; import java.time.LocalDateTime; import java.time.chrono.JapaneseDate; import java.time.chrono.ChronoLocalDateTime; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { ChronoLocalDateTime<JapaneseDate> japaneseDateTime = JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime()); // Default formatting System.out.println("Default format: " + japaneseDateTime); // Custom formatting DateTimeFormatter formatter = DateTimeFormatter.ofPattern("GGGG yyyy-MM-dd HH:mm:ss"); String formatted = japaneseDateTime.format(formatter); System.out.println("Custom format: " + formatted); // ISO formatting DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_DATE_TIME; System.out.println("ISO format: " + japaneseDateTime.format(isoFormatter)); } }
此示例展示了格式化 ChronoLocalDateTime
的不同方法。格式化程序包含非 ISO 日历的纪元信息。自定义模式可以显示日历特定的字段,例如日本年号。
转换为 ZonedDateTime
通过添加时区信息,ChronoLocalDateTime 可以转换为 ChronoZonedDateTime
。对于时区感知操作,这种转换至关重要。
package com.zetcode; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.chrono.JapaneseDate; import java.time.chrono.ChronoLocalDateTime; import java.time.chrono.ChronoZonedDateTime; public class Main { public static void main(String[] args) { ChronoLocalDateTime<JapaneseDate> japaneseDateTime = JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime()); // Convert to zoned date-time ChronoZonedDateTime<JapaneseDate> zonedDateTime = japaneseDateTime.atZone(ZoneId.of("Asia/Tokyo")); System.out.println("Zoned Japanese DateTime: " + zonedDateTime); // Convert to another time zone ChronoZonedDateTime<JapaneseDate> newYorkTime = zonedDateTime.withZoneSameInstant(ZoneId.of("America/New_York")); System.out.println("Japanese DateTime in New York: " + newYorkTime); } }
此示例演示了在 ChronoLocalDateTime
和 ChronoZonedDateTime
之间进行转换。转换保留了历法,同时添加了时区信息。时区转换会相应地调整时间。
日期和时间操作
ChronoLocalDateTime 通过 plus
和 minus
方法支持时间算术。这些操作遵守日历系统的规则。
package com.zetcode; import java.time.LocalDateTime; import java.time.chrono.JapaneseDate; import java.time.chrono.ChronoLocalDateTime; import java.time.temporal.ChronoUnit; public class Main { public static void main(String[] args) { ChronoLocalDateTime<JapaneseDate> japaneseDateTime = JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime()); System.out.println("Current: " + japaneseDateTime); // Add days ChronoLocalDateTime<JapaneseDate> nextWeek = japaneseDateTime.plus(7, ChronoUnit.DAYS); System.out.println("Next week: " + nextWeek); // Subtract months ChronoLocalDateTime<JapaneseDate> lastMonth = japaneseDateTime.minus(1, ChronoUnit.MONTHS); System.out.println("Last month: " + lastMonth); // Add hours and minutes ChronoLocalDateTime<JapaneseDate> later = japaneseDateTime.plusHours(2).plusMinutes(30); System.out.println("Later today: " + later); } }
此示例展示了在日本日历系统中的日期时间操作。这些操作处理日历特定的规则,例如月份长度。所有方法都返回新对象,因为 ChronoLocalDateTime 是不可变的。
提取日期和时间组件
ChronoLocalDateTime 提供了单独访问其日期和时间组件的方法。这些组件保留了其日历系统的特征。
package com.zetcode; import java.time.LocalDateTime; import java.time.chrono.JapaneseDate; import java.time.chrono.ChronoLocalDateTime; public class Main { public static void main(String[] args) { ChronoLocalDateTime<JapaneseDate> japaneseDateTime = JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime()); // Get date component JapaneseDate date = japaneseDateTime.toLocalDate(); System.out.println("Date: " + date); System.out.println("Era: " + date.getEra()); System.out.println("Year: " + date.getYear()); // Get time component System.out.println("Time: " + japaneseDateTime.toLocalTime()); System.out.println("Hour: " + japaneseDateTime.getHour()); System.out.println("Minute: " + japaneseDateTime.getMinute()); } }
此示例演示了访问 ChronoLocalDateTime
的组件。日期组件提供了日历特定的字段,例如纪元。时间组件在所有日历系统中都是一致的。
来源
在本文中,我们介绍了 Java ChronoLocalDateTime 接口的基本方法和特性。理解这些概念对于在 Java 应用程序中使用多个日历系统至关重要。
作者
列出所有Java教程。