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

Kir*_* Ch 4 java clock

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

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());
Run Code Online (Sandbox Code Playgroud)

输出给出相同的瞬间:

时钟 1 瞬时:2022-01-21T18:36:21.848Z
时钟 2 瞬时:2022-01-21T18:36:21.848Z

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

Bas*_*que 7

Instant

\n

你说:

\n
\n

输出给出相同的瞬间:

\n
\n

An是UTC 中的Instant时刻,即与 UTC 的偏移量为零时-分-秒。因此您的代码不使用您指定的时区。

\n

ZonedDateTime

\n

相反,尝试一下ZonedDateTime。这个类确实使用了时区。例如,调用捕获JVM \xe2\x80\x99s 当前默认时区ZonedDateTime.now()中看到的当前时刻。调用捕获该对象跟踪的当前时刻,如通过该对象\xe2\x80\x99s 分配的时区看到的那样。ZonedDateTime.now( myClock )ClockClock

\n
System.out.println("Clock1 ZonedDateTime.now: " + ZonedDateTime.now( clock1 ) );\nSystem.out.println("Clock2 ZonedDateTime.now: " + ZonedDateTime.now( clock2 ) );\n
Run Code Online (Sandbox Code Playgroud)\n

请参阅在 IdeOne.com 上实时运行的代码。顺便说一下,我们使用新的时区名称Asia/Kolkata而不是Asia/Calcutta

\n

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

\n
System.out.println("Clock1 ZonedDateTime.now: " + ZonedDateTime.now( clock1 ) );\nSystem.out.println("Clock2 ZonedDateTime.now: " + ZonedDateTime.now( clock2 ) );\n
Run Code Online (Sandbox Code Playgroud)\n

用于测试

\n

你问:

\n
\n

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

\n
\n

此功能对于测试非常有用,在测试中我们需要创建具有特定时区的已知场景,而不是使用 JVM\xe2\x80\x99s 实际默认时区。

\n