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

时间:2015-07-23 16:49:23

标签: java java-8 java-time zoneddatetime

给定Instant的对象,time string代表特定ZoneId的时间,如何构建带有日期部分的ZonedDateTime对象(年,月, (一天)从给定ZoneId的时刻和给定time string的时间部分?

例如:

如果Instant的值为 1437404400000 (相当于 20-07-2015 15:00 UTC ),则时间字符串 21:00 ,以及ZoneId代表欧洲/伦敦的对象,我想构建一个ZonedDateTime对象,相当于 20-07-2015 21:00欧洲/伦敦

2 个答案:

答案 0 :(得分:8)

创建即时消息并确定该瞬间的UTC日期:

$str = $doc->saveHTML($elements->item(0));

解析时间:

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();

从LocalDate和LocalTime在所需的ZoneId:

创建一个ZoneDateTime
LocalTime time = LocalTime.parse("21:00");

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

答案 1 :(得分:7)

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

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