6

给定一个对象Instant,atime string表示特定的时间ZoneId,如何构造一个ZonedDateTime对象,其中包含给定时刻的日期部分(年、月、日)和给定ZoneId的时间部分time string

例如:

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

4

2 回答 2

9

您需要将时间字符串解析为LocalTime第一个,然后您可以ZonedDateTime从该Instant区域调整 a,然后应用时间。例如:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm", Locale.US);
LocalTime time = LocalTime.parse(timeText, formatter);
ZonedDateTime zoned = instant.atZone(zoneId)
                             .with(time);
于 2015-07-23T16:54:51.407 回答
8

创建瞬间并确定该瞬间的 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 中的日期可能与该时刻给定时区中的日期不同。

于 2015-07-23T17:01:31.643 回答