将 LocalDateTime 转换为 Instant 需要 ZoneOffset。为什么?

Convert LocalDateTime to Instant requires a ZoneOffset. Why?

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

我发现 LocalDateTime 有一个 toInstant 方法,但它要求我 ZoneOffset.

我不太明白如何使用它,或者 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)

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