ZetCode

Java LocalTime

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

在本文中,我们将展示如何在 Java 中使用 LocalTime。我们将计算当前本地时间、解析本地时间、格式化本地时间、比较本地时间并进行时间算术运算。

LocalTime 是 ISO-8601 日历系统中不带时区的时间。LocalTime 是一个不可变的日期时间对象。

LocalTime 不存储或表示日期或时区。它描述的是在挂钟上看到的本地时间。挂钟时间,也称为现实世界时间或实际时间,指的是由腕表或挂钟等计时器确定的经过时间。

比较时应使用 equals 方法。

当前时间

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

Main.java
import java.time.LocalTime;

void main() {

    LocalTime now = LocalTime.now();
    System.out.println(now);
}

该示例打印当前的本地时间。

$ java Main.java
11:43:02.229989200

创建 LocalTime 对象

在 Java 中有几种创建 LocalTime 的方法。

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

void main() {

    // Current Time
    LocalTime time1 = LocalTime.now();
    System.out.println(time1);

    // Specific Time
    LocalTime time2 = LocalTime.of(7, 20, 45, 342123342);
    System.out.println(time2);

    // Specific Time
    LocalTime time3 = LocalTime.parse("12:32:22",
        DateTimeFormatter.ISO_TIME);
    System.out.println(time3);

    // Retrieving from LocalDateTime
    LocalTime time4 = LocalDateTime.now().toLocalTime();
    System.out.println(time4);
}

该示例展示了四种方法

LocalTime time1 = LocalTime.now();

LocalTime.now 创建当前的本地时间。

LocalTime time2 = LocalTime.of(7, 20, 45, 342123342);

使用 LocalTime.of,我们可以从小时、分钟、秒和纳秒创建一个特定的本地时间。

LocalTime time3 = LocalTime.parse("12:32:22",
            DateTimeFormatter.ISO_TIME);

使用 LocalTime.parse,我们可以从字符串解析 LocalTime

LocalTime time4 = LocalDateTime.now().toLocalTime();

也可以从 LocalDateTime 对象获取 LocalTime

$ java Main.java
18:18:12.135
07:20:45.342123342
12:32:22
18:18:12.186

LocalTime 小时、分钟、秒

以下示例将本地时间拆分为小时、分钟和秒部分。

Main.java
import java.time.LocalTime;

void main() {

    LocalTime time = LocalTime.now();

    System.out.printf("Hour: %s%n", time.getHour());
    System.out.printf("Minute: %s%n", time.getMinute());
    System.out.printf("Second: %s%n", time.getSecond());
}

getHour 获取小时部分,getMinute 获取分钟部分,getSecond 获取 LocalTime 的秒部分。

$ java Main.java
Hour: 11
Minute: 41
Second: 47

LocalTime 时区

我们可以计算特定时区的本地时间。但是,LocalTime 不存储时区信息。

Main.java
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;

void main() {

    ZoneId zone1 = ZoneId.of("Europe/Bratislava");
    ZoneId zone2 = ZoneId.of("Europe/Moscow");

    LocalTime now1 = LocalTime.now(zone1);
    LocalTime now2 = LocalTime.now(zone2);

    System.out.printf("Bratislava time: %s%n", now1);
    System.out.printf("Moscow time: %s%n", now2);

    long hoursBetween = ChronoUnit.HOURS.between(now1, now2);
    long minutesBetween = ChronoUnit.MINUTES.between(now1, now2);

    System.out.println(hoursBetween);
    System.out.println(minutesBetween);
}

该示例找出莫斯科和布拉迪斯拉发的当前本地时间。我们还计算了这两个城市之间的时间差。

ZoneId zone1 = ZoneId.of("Europe/Bratislava");
ZoneId zone2 = ZoneId.of("Europe/Moscow");

我们使用 ZoneId.of 方法指定时区。

LocalTime now1 = LocalTime.now(zone1);
LocalTime now2 = LocalTime.now(zone2);

要创建本地时间,我们将时区传递给 LocalTime.now

long hoursBetween = ChronoUnit.HOURS.between(now1, now2);
long minutesBetween = ChronoUnit.MINUTES.between(now1, now2);

我们计算了这两个城市之间的小时和分钟差。

$ java Main.java
Bratislava time: 11:42:13.775138900
Moscow time: 12:42:13.777141
1
60

LocalTime 格式

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

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

void main() {

    LocalTime now = LocalTime.now();

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

    DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("hh:mm:ss");
    System.out.println(now.format(dtf2));

    DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern("hh:mm:ss a");
    System.out.println(now.format(dtf3));
}

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

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

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

DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("hh:mm:ss");

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

$ java Main.java
11:43:59.9144994
11:43:59
11:43:59 AM

LocalTime 算术运算

Java LocalTime 具有执行时间算术运算的方法。

Main.java
import java.time.LocalTime;

void main() {

    LocalTime now = LocalTime.now();
    System.out.println("Current Time: " + now);

    // LocalTime addition
    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));

    // LocalTime subtraction
    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
Current Time: 11:44:32.932360500
Adding 3 hours: 14:44:32.932360500
Adding 30 minutes: 12:14:32.932360500
Adding 45 seconds: 11:45:17.932360500
Adding 40000 nanoseconds: 11:44:32.932400500
Subtracting 3 hours: 08:44:32.932360500
Subtracting 30 minutes: 11:14:32.932360500
Subtracting 45 seconds: 11:43:47.932360500
Subtracting 40000 nanoseconds: 11:44:32.932320500

LocalTime until 方法

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

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

void main() {

    LocalTime now = LocalTime.now();
    LocalTime time = LocalTime.parse("22:15:30");

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

该示例计算了到另一个时间还需经过的小时、分钟和秒。

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

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

$ java Main.java
10 hours
630 minutes
37808 seconds

比较 LocalTime 对象

以下示例展示了如何比较时间。

Main.java
import java.time.LocalTime;

void main() {

    LocalTime time1 = LocalTime.of(4, 23, 12);
    LocalTime time2 = LocalTime.of(8, 03, 50);
    LocalTime time3 = LocalTime.of(12, 47, 35);

    if (time1.compareTo(time2) == 0) {
        System.out.println("time1 and time2 are equal");
    } else {
        System.out.println("time1 and time2 are not equal");
    }

    if (time2.isBefore(time3)) {
        System.out.println("time2 comes before time3");
    } else {
        System.out.println("time2 does not come before time3");
    }

    if (time3.isAfter(time1)) {
        System.out.println("time3 comes after time1");
    } else {
        System.out.println("time3 does not come after time1");
    }
}

该示例比较时间。我们检查它们是否相等,是否早于或晚于另一个时间。

if (time1.compareTo(time2) == 0) {

compareTo 比较两个本地时间。

if (time2.isBefore(time3)) {

isBefore 检查一个时间是否早于另一个时间。

if (time3.isAfter(time1)) {

isAfter 检查一个时间是否晚于另一个时间。

$ java Main.java
time1 and time2 are not equal
time2 comes before time3
time3 comes after time1

truncatedTo 方法

LocalTimetruncatedTo 方法返回截断时间后的本地时间副本。

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

void main() {

    LocalTime now = LocalTime.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
11:46:46.017153200
00:00
11:00
11:46
11:46:46
11:46:46.017153

来源

Java LocalTime - 语言参考

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

作者

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

列出所有Java教程