ZetCode

Java LocalDateTime

最后修改日期:2024 年 7 月 10 日

在本文中,我们将展示如何在 Java 中使用 LocalDateTime。

LocalDateTime 是一个不可变的日期时间对象,表示一个日期时间。它是 ISO-8601 日历系统中没有时区的日期时间。

LocalDateTime 不存储或表示时区。如果没有额外的偏移量或时区等信息,它无法表示时间线上的一个瞬间。例如,值 2022-10-27T11:01:19.031990446 就是一个 LocalDateTime

当前日期时间

使用 LocalDateTime.now 获取当前时间。

Main.java
import java.time.LocalDateTime;

void main() {

    var now = LocalDateTime.now();
    System.out.println(now);
}

该示例打印当前本地日期时间值。

$ java Main.java
2024-07-10T14:20:27.792280600

创建 LocalDateTime 对象

有几种方法可以创建 LocalDateTime

Main.java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

void main() {

    var now = LocalDateTime.now();
    System.out.println(now);

    LocalDateTime dt1 = LocalDateTime.of(2022, 10, 27, 10, 40, 55);
    System.out.println(dt1);

    LocalDateTime dt2 = LocalDateTime.parse("2020-11-27T11:20:50", 
        DateTimeFormatter.ISO_LOCAL_DATE_TIME);

    System.out.println(dt2);
}

该程序创建三个日期时间对象。

var now = LocalDateTime.now();

使用 LocalDateTime.now 创建当前日期时间。

LocalDateTime dt1 = LocalDateTime.of(2022, 10, 27, 10, 40, 55);

这里使用 LocalDateTime.of 创建一个本地日期时间值。 我们指定年、月、日、小时和秒部分。

LocalDateTime dt2 = LocalDateTime.parse("2020-11-27T11:20:50", 
    DateTimeFormatter.ISO_LOCAL_DATE_TIME);

从字符串解析本地日期时间值。

$ java Main.java 
2024-07-10T14:21:17.484172200
2022-10-27T10:40:55
2020-11-27T11:20:50

LocalDateTime 部分

在下一个示例中,我们获取当前的 LocalDateTime 值部分。

Main.java
import java.time.LocalDateTime;

void main() {

    LocalDateTime dt = LocalDateTime.now();

    System.out.printf("Year: %s%n", dt.getYear());
    System.out.printf("Month: %s%n", dt.getMonth());
    System.out.printf("Day of month: %s%n", dt.getDayOfMonth());
    System.out.printf("Hour: %s%n", dt.getHour());
    System.out.printf("Minute: %s%n", dt.getMinute());
    System.out.printf("Second: %s%n", dt.getSecond());
}

getYear 获取年份部分,getMonth 获取月份部分,getDayOfMonth 获取月份中的天数。 getHour 获取小时部分,getMinute 获取分钟部分,getSecond 获取秒部分。

$ java Main.java
Year: 2024
Month: JULY
Day of month: 10
Hour: 14
Minute: 17
Second: 2

LocalDateTime & DateTimeFormatter

在不同的国家/地区,日期时间的格式不同。 DateTimeFormatter 帮助我们格式化日期时间。

Main.java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;

void main() {

    LocalDateTime now = LocalDateTime.now();

    DateTimeFormatter dtf = DateTimeFormatter.ISO_TIME;
    System.out.println(now.format(dtf));

    DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("EEEE, MMM dd, yyyy HH:mm:ss a");
    System.out.println(now.format(dtf2));

    DateTimeFormatter dtf3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    System.out.println(now.format(dtf3));
}

该示例使用 DateTimeFormatter 格式化时间。

DateTimeFormatter dtf = DateTimeFormatter.ISO_TIME;
System.out.println(now.format(dtf));

我们将时间格式化为 ISO 格式时间标准。

DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("EEEE, MMM dd, yyyy HH:mm:ss a");

我们可以使用 DateTimeFormatter.ofPattern 选择特定的时间格式。 DateTimeFormatter 的文档包含我们可以使用的各种格式化字符的描述。

DateTimeFormatter dtf3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);

这里我们使用 FormatStyle.MEDIUM 格式。

$ java Main.java
14:17:39.5461673
streda, júl 10, 2024 14:17:39 PM
10. 7. 2024, 14:17:39

LocalTime 算术

Java LocalDateTimeEx 具有用于进行日期时间算术的方法。

Main.java
import java.time.LocalDateTime;

void main() {

    LocalDateTime now = LocalDateTime.now();
    System.out.println(now);

    // LocalDateTime addition
    System.out.println("Adding 4 years: " + now.plusYears(4));
    System.out.println("Adding 11 months: " + now.plusMonths(11));
    System.out.println("Adding 54 days: " + now.plusDays(54));
    System.out.println("Adding 3 hours: " + now.plusHours(3));
    System.out.println("Adding 30 minutes: " + now.plusMinutes(30));
    System.out.println("Adding 45 seconds: " + now.plusSeconds(45));
    System.out.println("Adding 40000 nanoseconds: " + now.plusNanos(40000));

    System.out.println("-------------------------------------");

    // LocalDateTime subtraction
    System.out.println("Subtracting 4 years: " + now.minusYears(4));
    System.out.println("Subtracting 11 months: " + now.minusMonths(11));
    System.out.println("Subtracting 54 days: " + now.minusDays(54));
    System.out.println("Subtracting 3 hours: " + now.minusHours(3));
    System.out.println("Subtracting 30 minutes: " + now.minusMinutes(30));
    System.out.println("Subtracting 45 seconds: " + now.minusSeconds(45));
    System.out.println("Subtracting 40000 nanoseconds: " + now.minusNanos(40000));
}

该示例展示了用于添加和减去日期时间单位的方法。

System.out.println("Adding 3 hours: " + localTime.plusHours(3));

plusHours 将当前本地时间增加三个小时。

System.out.println("Subtracting 3 hours: " + now.minusHours(3));

同样,minusHours 从当前本地时间减去三个小时。

$ java Main.java
2024-07-10T14:18:29.986426300
Adding 4 years: 2028-07-10T14:18:29.986426300
Adding 11 months: 2025-06-10T14:18:29.986426300
Adding 54 days: 2024-09-02T14:18:29.986426300
Adding 3 hours: 2024-07-10T17:18:29.986426300
Adding 30 minutes: 2024-07-10T14:48:29.986426300
Adding 45 seconds: 2024-07-10T14:19:14.986426300
Adding 40000 nanoseconds: 2024-07-10T14:18:29.986466300
-------------------------------------
Subtracting 4 years: 2020-07-10T14:18:29.986426300
Subtracting 11 months: 2023-08-10T14:18:29.986426300
Subtracting 54 days: 2024-05-17T14:18:29.986426300
Subtracting 3 hours: 2024-07-10T11:18:29.986426300
Subtracting 30 minutes: 2024-07-10T13:48:29.986426300
Subtracting 45 seconds: 2024-07-10T14:17:44.986426300
Subtracting 40000 nanoseconds: 2024-07-10T14:18:29.986386300

LocalTime until

使用 until 方法,我们可以计算到另一个时间的时间,以指定的单位表示。

Main.java
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

void main() {

    LocalDateTime now = LocalDateTime.now();
    LocalDateTime xmas = LocalDateTime.of(now.getYear(), 12, 24, 0, 0 ,0);

    System.out.println(now);
    System.out.println(xmas);

    System.out.printf("%s hours%n", now.until(xmas, ChronoUnit.HOURS));
    System.out.printf("%s minutes%n", now.until(xmas, ChronoUnit.MINUTES));
    System.out.printf("%s seconds%n", now.until(xmas, ChronoUnit.SECONDS));
}

该示例计算到另一个时间必须经过的小时、分钟和秒数。

System.out.printf("%s hours%n", now.until(time, ChronoUnit.HOURS));

使用 ChronoUnit.HOURS,我们指定以小时为单位计算时间差。

$ java Main.java
2024-07-10T14:19:00.847871600
2024-12-24T00:00
3993 hours
239620 minutes
14377259 seconds

LocalTime isBefore/isAfter

我们可以使用 isBeforeisAfter 检查日期时间值是否在另一个日期时间值之前或之后。

Main.java
import java.time.LocalDateTime;

void main() {

    LocalDateTime now = LocalDateTime.now();
    LocalDateTime dt1 = now.plusYears(3);
    LocalDateTime dt2 = now.minusYears(3);

    if (dt1.isAfter(now)) {
        System.out.printf("%s is after %s%n", dt1, now);
    }

    if (dt2.isBefore(now)) {
        System.out.printf("%s is before %s%n", dt2, now);
    }
}

该程序使用 isBeforeisAfter 方法来检查当前日期时间值与另外两个日期时间值。

$ java Main.java
2025-10-27T12:25:45.261416509 is after 2022-10-27T12:25:45.261416509
2019-10-27T12:25:45.261416509 is before 2022-10-27T12:25:45.261416509

LocalDateTime 截断

LocalDateTimetruncatedTo 方法返回截断时间的本地时间的副本。 它返回原始日期时间的副本,其中小于指定单位的字段设置为零。

Main.java
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

void main() {

    LocalDateTime now = LocalDateTime.now();

    System.out.println(now);
    System.out.println(now.truncatedTo(ChronoUnit.HALF_DAYS));
    System.out.println(now.truncatedTo(ChronoUnit.HOURS));
    System.out.println(now.truncatedTo(ChronoUnit.MINUTES));
    System.out.println(now.truncatedTo(ChronoUnit.SECONDS));
    System.out.println(now.truncatedTo(ChronoUnit.MICROS));
}

该示例使用 truncatedTo 将时间截断为半天、小时、分钟、秒和微秒。

$ java Main.java
2024-07-10T14:19:49.389096800
2024-07-10T12:00
2024-07-10T14:00
2024-07-10T14:19
2024-07-10T14:19:49
2024-07-10T14:19:49.389096

来源

Java LocalDateTime - 语言参考

在本文中,我们使用了 Java LocalDateTime。

作者

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

列出所有Java教程