问题
I have an Instant coming from a source that should, according to the spec, be a LocalDate, but don't see any methods in LocalDate for the conversion. What is the best way to do this?
回答1:
LocalDate.ofInstant(...);
I believe was added in Java 9.
LocalDateTime has that method in Java 8.
yourInstant.atZone(yourZoneId).toLocalDate();
Will work with earlier versions for LocalDate...
回答2:
Other answers provided the mechanics for the transformation, but I wanted to add some background on the meaning of such transformation which hopefully helps explain why it works the way it works.
LocalDate
and Instant
seem similar – they both hold date(/time) information without the time zone information. However, they have quite a different meaning.
Instant
represents a point in time unambiguously. The representation does not explicitly contain any time zone, but implicitly it refers to the UTC time line.
LocalDateTime
(and LocalDate
) is ambiguous, because it represents a point in the local timeline, which implicitly refers to the local time zone.
So, in order to correctly transform an Instant
into a LocalDateTime
(conceptually – some of these steps are bundled together into a single operation in the implementation) you need to:
1. convert the Instant
into a ZonedDateTime
by applying the UTC time zone info
2. change the time zone from UTC to the local time zone (which implies applying the relevant time zone offset) which gives you another ZonedDateTime
(with different time zone)
3. convert the ZonedDateTime
into a LocalDateTime
which makes the time zone implicit (local) by removing the time zone info.
Finally, you can drop the time-part of LocalDateTime
and end up with the LocalDate
.
回答3:
If using java 8 you can do the following
Instant instantOfNow = Instant.now();
LocalDate localDate
= LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
回答4:
You need to ask yourself at what zone offset you want to transform it to most probably and when you know the answer to that:
LocalDate.ofInstant(yourInstant, yourZoneOffSet)
EDIT
just realized that this is only possible since java-9, for a pre-java9 see the other answer
来源:https://stackoverflow.com/questions/52264768/how-to-convert-from-instant-to-localdate