ZetCode

Java ChronoLocalDateTime 接口

最后修改时间:2025 年 4 月 16 日

java.time.chrono.ChronoLocalDateTime 接口表示在任意历法中没有时区的日期时间。它是不同日历系统中日期时间对象的基本接口。

ChronoLocalDateTime 结合了日期和时间组件,同时独立于时区。它支持 ISO-8601 之外的各种日历系统。该接口是不可变的且线程安全的。

ChronoLocalDateTime 概述

ChronoLocalDateTime 提供了日期时间操作、比较和格式化的方法。它与 Chronology 一起工作,以支持不同的日历系统。该接口扩展了 TemporalComparable

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 对象通常通过 JapaneseDateHijrahDate 等实现来创建。ISO 日历系统使用 LocalDateTime

Main.java
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 支持跨不同日历系统的比较操作。比较基于时间轴上的同一时刻。

Main.java
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 进行格式化。格式化程序尊重正在格式化的日期时间值的历法。

Main.java
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。对于时区感知操作,这种转换至关重要。

Main.java
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);
    }
}

此示例演示了在 ChronoLocalDateTimeChronoZonedDateTime 之间进行转换。转换保留了历法,同时添加了时区信息。时区转换会相应地调整时间。

日期和时间操作

ChronoLocalDateTime 通过 plusminus 方法支持时间算术。这些操作遵守日历系统的规则。

Main.java
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 提供了单独访问其日期和时间组件的方法。这些组件保留了其日历系统的特征。

Main.java
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 ChronoLocalDateTime 接口的基本方法和特性。理解这些概念对于在 Java 应用程序中使用多个日历系统至关重要。

作者

我的名字是 Jan Bodnar,是一位经验丰富的程序员,在该领域拥有多年的经验。我从 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和八本电子书。凭借超过八年的教学经验,我致力于分享我的知识,并帮助他人掌握编程概念。

列出所有Java教程