ZetCode

Java LocalDateTime 类

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

java.time.LocalDateTime 类表示 ISO-8601 日历系统中没有时区的日期时间。它结合了 LocalDate 和 LocalTime 来表示完整的日期和时间。LocalDateTime 是不可变的且线程安全的。

LocalDateTime 通常用于表示不需要时区的日期和时间。它以纳秒精度存储日期和时间。该类提供了用于日期时间算术和格式化的方法。

LocalDateTime 类概述

LocalDateTime 提供了创建、解析和操作日期时间值的方法。关键操作包括获取字段、执行计算以及转换为其他类型。该类处理从公元前 -999,999,999 年到公元 +999,999,999 年的日期。

public final class LocalDateTime implements Temporal, TemporalAdjuster, 
    ChronoLocalDateTime<LocalDate>, Serializable {
    public static LocalDateTime now();
    public static LocalDateTime of(int year, int month, int dayOfMonth, 
        int hour, int minute);
    public static LocalDateTime parse(CharSequence text);
    public int getYear();
    public int getMonthValue();
    public int getDayOfMonth();
    public int getHour();
    public int getMinute();
    public LocalDateTime plusDays(long days);
    public LocalDateTime minusHours(long hours);
    public boolean isBefore(ChronoLocalDateTime<?> other);
    public boolean isAfter(ChronoLocalDateTime<?> other);
}

上面的代码展示了 LocalDateTime 提供的关键方法。这些方法允许创建、比较和操作日期时间值。该类提供高达纳秒的精度,同时保持简单的 API。

创建 LocalDateTime 对象

LocalDateTime 对象可以通过多种方式创建。最常用的方法是 now 获取当前时间,以及用于特定日期时间的工厂方法。也支持从字符串解析。

Main.java
package com.zetcode; 

import java.time.LocalDateTime;

public class Main {

    public static void main(String[] args) {
        
        // Current date-time
        LocalDateTime now = LocalDateTime.now();
        System.out.println("Current date-time: " + now);
        
        // Specific date-time
        LocalDateTime specific = LocalDateTime.of(2025, 5, 15, 14, 30);
        System.out.println("Specific date-time: " + specific);
        
        // From string
        LocalDateTime parsed = LocalDateTime.parse("2025-01-01T12:00:00");
        System.out.println("Parsed from string: " + parsed);
        
        // Combining LocalDate and LocalTime
        LocalDateTime combined = LocalDateTime.of(
            java.time.LocalDate.now(), 
            java.time.LocalTime.of(18, 30)
        );
        System.out.println("Combined date-time: " + combined);
    }
}

此示例演示了创建 LocalDateTime 对象的不同方法。输出以 ISO-8601 格式显示日期时间。 now 方法捕获当前的精确时刻,精度可达纳秒(如果可用)。

获取日期和时间组件

一个 LocalDateTime 可以分解成其日期和时间组件。这些值表示年、月、日、时、分等。这些方法对于提取日期时间的特定部分很有用。

Main.java
package com.zetcode; 

import java.time.LocalDateTime;
import java.time.Month;

public class Main {

    public static void main(String[] args) {

        LocalDateTime dateTime = LocalDateTime.now();
        
        // Date components
        int year = dateTime.getYear();
        Month month = dateTime.getMonth();
        int day = dateTime.getDayOfMonth();
        
        System.out.println("Date: " + year + "-" + month.getValue() + "-" + day);
        
        // Time components
        int hour = dateTime.getHour();
        int minute = dateTime.getMinute();
        int second = dateTime.getSecond();
        int nano = dateTime.getNano();
        
        System.out.println("Time: " + hour + ":" + minute + ":" + second);
        System.out.println("Nanoseconds: " + nano);
        
        // Day of week
        System.out.println("Day of week: " + dateTime.getDayOfWeek());
    }
}

此示例展示了如何从 LocalDateTime 中提取组件。请注意,月份可以检索为 Month 枚举或数值。所有组件都可以通过简单的 getter 方法获得。

比较 LocalDateTime

可以比较 LocalDateTime 对象以确定时间顺序。该类提供 isBeforeisAftercompareTo 方法。这些比较对于基于日期时间的逻辑至关重要。

Main.java
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();
        LocalDateTime later = now.plus(1, ChronoUnit.HOURS);
        LocalDateTime earlier = now.minus(30, ChronoUnit.MINUTES);
        
        System.out.println("Now is before later: " + now.isBefore(later));
        System.out.println("Now is after earlier: " + now.isAfter(earlier));
        System.out.println("Comparison result: " + now.compareTo(later));
        
        // Equality check
        LocalDateTime copy = LocalDateTime.of(
            now.getYear(), now.getMonthValue(), now.getDayOfMonth(),
            now.getHour(), now.getMinute(), now.getSecond(), now.getNano()
        );
        System.out.println("Now equals copy: " + now.equals(copy));
    }
}

此示例演示了比较 LocalDateTime 对象的各种方法。比较方法考虑所有日期和时间组件。请注意,相等性要求所有组件完全匹配。

添加和减去时间

LocalDateTime 通过 plusminus 方法支持时间算术。这些操作对于计算未来或过去的日期时间很有用。该类自动处理字段之间的溢出。

Main.java
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();
        
        // Add days
        LocalDateTime inOneWeek = now.plusDays(7);
        System.out.println("In one week: " + inOneWeek);
        
        // Subtract hours
        LocalDateTime twoHoursAgo = now.minusHours(2);
        System.out.println("Two hours ago: " + twoHoursAgo);
        
        // Add using ChronoUnit
        LocalDateTime nextMonth = now.plus(1, ChronoUnit.MONTHS);
        System.out.println("Next month: " + nextMonth);
        
        // Mixed operations
        LocalDateTime complex = now.plusDays(2)
                                 .minusHours(3)
                                 .plusMinutes(15);
        System.out.println("Complex operation result: " + complex);
    }
}

此示例展示了使用 LocalDateTime 执行时间算术的各种方法。操作可以使用特定的单位方法或 ChronoUnit 常量。所有计算都精确到纳秒,并自动处理字段溢出。

在时间类型之间转换

LocalDateTime 可以与 Instant 或 ZonedDateTime 等其他时间类型进行相互转换。在处理时区或时间戳时,这些转换至关重要。

Main.java
package com.zetcode; 

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.Instant;

public class Main {

    public static void main(String[] args) {

        LocalDateTime now = LocalDateTime.now();
        
        // Convert to ZonedDateTime
        ZonedDateTime zoned = now.atZone(ZoneId.of("Europe/Paris"));
        System.out.println("In Paris: " + zoned);
        
        // Convert to Instant (requires time zone)
        Instant instant = now.atZone(ZoneId.systemDefault()).toInstant();
        System.out.println("As instant: " + instant);
        
        // Convert from Instant
        LocalDateTime fromInstant = LocalDateTime.ofInstant(
            Instant.now(), ZoneId.of("America/New_York"));
        System.out.println("From instant: " + fromInstant);
        
        // Convert to LocalDate or LocalTime
        System.out.println("Date part: " + now.toLocalDate());
        System.out.println("Time part: " + now.toLocalTime());
    }
}

此示例演示了 LocalDateTime 和其他时间类型之间的转换。请注意,转换为 Instant 需要指定时区。所有转换都保留了所表示的确切日期和时间。

格式化和解析

LocalDateTime 支持通过 DateTimeFormatter 进行格式化和解析。这允许在字符串和日期时间对象之间进行灵活的转换。

Main.java
package com.zetcode; 

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;

public class Main {

    public static void main(String[] args) {

        LocalDateTime now = LocalDateTime.now();
        
        // Default format
        System.out.println("Default format: " + now);
        
        // Custom format
        DateTimeFormatter custom = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        System.out.println("Custom format: " + now.format(custom));
        
        // Localized format
        DateTimeFormatter localized = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.FRENCH);
        System.out.println("French format: " + now.format(localized));
        
        // Parsing from custom format
        LocalDateTime parsed = LocalDateTime.parse(
            "2025/12/31 23:59:59", 
            DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")
        );
        System.out.println("Parsed custom: " + parsed);
    }
}

此示例展示了如何使用各种模式格式化和解析 LocalDateTime。 DateTimeFormatter 提供预定义和自定义格式化选项。本地化格式适应不同的文化惯例。

来源

Java LocalDateTime 类文档

在本文中,我们介绍了 Java LocalDateTime 类的基本方法和特性。理解这些概念对于在没有时区要求的 Java 应用程序中处理日期时间至关重要。

作者

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

列出所有Java教程