Why does the java.time.Clock has zone information?
Asked Answered
B

2

14

Why does java.time.Clock has zone information? From the Clock you only can get an Instant when calling the instant() method - which is a time without zone info.

Is the only purpose to have the zone available in the clock to e.g. create a ZonedDateTime like this? ZonedDateTime.ofInstant(clock().instant(), clock().getZone())

Wouldn't it then make sense to have a method zonedDateTime() in the Clock class?

Belding answered 28/11, 2018 at 10:59 Comment(0)
C
7

Alternate clock behaviors

Quoting the Clock documentation (emphasis mine):

Use of a Clock is optional. All key date-time classes also have a now() factory method that uses the system clock in the default time zone. The primary purpose of this abstraction is to allow alternate clocks to be plugged in as and when required. Applications use an object to obtain the current time rather than a static method. This can simplify testing.

For example, Clock.fixed( Instant fixedInstant, ZoneId zone ) always reports the current moment as a specific moment, a fixed (non-changing) point in time.

Carn answered 28/11, 2018 at 11:26 Comment(1)
You're right. The now() implementation of ZoneDateTime that takes a clock looks like this: ` public static ZonedDateTime now(Clock clock) { return ofInstant(clock.instant(), clock.getZone()); } `Belding
L
6

I suppose it takes a bit of mind reading or guessing to answer your question, but let me try anyway. As far as I can see, the Clock knowing a time zone is very convenient when using any of the now methods taking a Clock argument. None of the following methods could work correctly if the Clock wasn’t able to provide a time zone:

The list may not be complete. Only Instant.now(Clock) doesn’t need a time zone and ignores the time zone of the Clock.

And yes, the alternative design where Clock had a zonedDateTime method providing the same result as ZonedDateTime.now(Clock) would have made sense too. However: Someone wanting to develop, say, a JewishDate class would never be able to insert a jewishDate method into the Clock class. With the existing design they can design their JewishDate class along the exact same lines as the existing date and time classes, including a JewishDate.now(Clock) method.

Lucania answered 29/11, 2018 at 7:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.