如何从 Instant 和时间字符串构造 ZonedDateTime?

How to construct ZonedDateTime from an Instant and a time string?

给定一个 Instant 的对象,一个 time string 表示特定 ZoneId 的时间,如何构造一个 ZonedDateTime 带有日期部分(年,月、日)从给定 ZoneId 的瞬间开始,从给定 time string?

的时间部分开始

例如:

给定一个值为 1437404400000 的 Instant 对象(相当于 20-07-2015 15:00 UTC),一个时间字符串21:00,和一个ZoneId的对象代表Europe/London,我想构造一个对象ZonedDateTime 相当于 20-07-2015 21:00 Europe/London.

您需要先将时间字符串解析为 LocalTime,然后您可以使用时区从 Instant 调整 ZonedDateTime,然后应用时间。例如:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm", Locale.US);
LocalTime time = LocalTime.parse(timeText, formatter);
ZonedDateTime zoned = instant.atZone(zoneId)
                             .with(time);

创建瞬间并确定该瞬间的 UTC 日期:

Instant instant = Instant.ofEpochMilli(1437404400000L);
LocalDate date = instant.atZone(ZoneOffset.UTC).toLocalDate();

// or if you want the date in the time zone at that instant:

ZoneId tz = ZoneId.of("Europe/London");
LocalDate date = instant.atZone(tz).toLocalDate();

解析时间:

LocalTime time = LocalTime.parse("21:00");

根据所需 ZoneId 的 LocalDate 和 LocalTime 创建 ZoneDateTime:

ZonedDateTime zdt = ZonedDateTime.of(date, time, tz);

正如 Jon 所指出的,您需要决定您想要的日期,因为 UTC 中的日期可能与当时给定时区中的日期不同。