Java 将LocalDateTime转换为Instant需要区域偏移。为什么?

Java 将LocalDateTime转换为Instant需要区域偏移。为什么?,java,java-time,Java,Java Time,我需要将LocalDateTime对象转换为新的Instant对象 我已经意识到,LocalDateTime有一个toInstant方法,但它请求我一个ZoneOffset 我不太明白如何使用它,或者分区偏移的含义是什么。您可以尝试以下方法: LocalDateTime dateTime = LocalDateTime.of(2018, Month.OCTOBER, 10, 31, 56); Instant instant = dateTime.atZone(ZoneId.of("Europe/

我需要将
LocalDateTime
对象转换为新的
Instant
对象

我已经意识到,
LocalDateTime
有一个
toInstant
方法,但它请求我一个
ZoneOffset

我不太明白如何使用它,或者分区偏移的含义是什么。

您可以尝试以下方法:

LocalDateTime dateTime = LocalDateTime.of(2018, Month.OCTOBER, 10, 31, 56);
Instant instant = dateTime.atZone(ZoneId.of("Europe/Rome")).toInstant();
System.out.println(instant);

您不能将
LocalDateTime
直接转换为
Instant
,因为
LocalDateTime
可以表示多个瞬间。它并不代表一个特定的时间瞬间

下面是一个
LocalDateTime

23/10/2018 09:30:00
你能仅仅通过观察就知道上面提到的是哪一个时刻吗?不,因为在英国的那一刻与在中国的那一刻不同

要想知道时间指的是什么时刻,您还需要知道它与UTC的偏移量是多少小时,这就是
ZoneOffset
的基本含义

例如,对于8小时的偏移量,您可以这样写:

localDateTime.toInstant(ZoneOffset.ofHours(8))
或者,如果您知道您总是希望该本地日期时间的当前时区中的区域偏移量,则可以将
ZoneOffset.ofHours(8)
替换为:

ZoneId.systemDefault().getRules().getOffset(localDateTime)

在将其转换为瞬间之前,您应该考虑要使用的偏移量。

查看状态:历元秒是从标准Java历元1970-01-01T00:00:00Z开始测量的。Z代表祖鲁时区。重要的是您需要一个时区,这样Java就可以从给定的时间正确地计算出瞬间。很好的解释。您是否可以添加一种编程方式来确定本地系统的偏移量?我在服务器上。如何获取当前服务器的分区偏移量?虽然它没有真正回答标题中的“为什么”,但它清楚地显示了解决问题的正确方法(当然,必须替换正确的时区)。