java.time.Clock 中 ZoneId 的用途是什么?

What is a purpose of ZoneId in java.time.Clock?

我们可以从 Clock 创建 Instant。时钟有时区。

Clock clock1 = Clock.system(ZoneId.of("Europe/Paris"));
Clock clock2 = Clock.system(ZoneId.of("Asia/Calcutta"));
System.out.println("Clock1 instant: " + clock1.instant());
System.out.println("Clock2 instant: " + clock2.instant());

输出给出相同的瞬间:

Clock1 instant: 2022-01-21T18:36:21.848Z
Clock2 instant: 2022-01-21T18:36:21.848Z

那么在时钟中设置时区的目的是什么?

Instant

你说:

The output gives the same instant:

Instant 是在 UTC 中看到的时刻 ,即与 UTC 的偏移量为零 hours-minutes-seconds。所以你的代码没有使用你指定的时区。

ZonedDateTime

相反,尝试 ZonedDateTime. This class does make use of the time zone. For example, calling ZonedDateTime.now() captures the current moment as seen in the JVM’s current default time zone. Calling ZonedDateTime.now( myClock ) captures the current moment tracked by that Clock 对象,如通过 Clock 对象分配的时区所见。

System.out.println("Clock1 ZonedDateTime.now: " + ZonedDateTime.now( clock1 ) );
System.out.println("Clock2 ZonedDateTime.now: " + ZonedDateTime.now( clock2 ) );

看到这个 code run live at IdeOne.com. By the way, there we use the new time zone name Asia/Kolkata 而不是 Asia/Calcutta

注意一天中的不同时间,16:21 与 20:51。并注意不同的时区。

Clock1 ZonedDateTime.now: 2022-01-22T16:21:26.490913+01:00[Europe/Paris]
Clock2 ZonedDateTime.now: 2022-01-22T20:51:26.492823+05:30[Asia/Kolkata]

用于测试

你问过:

So what is a purpose of having a timezone in Clock?

此功能对 testing 很有用,我们需要创建一个具有特定时区的已知场景,而不是使用 JVM 的实际默认时区。