使用java.time在时刻中替换时间部分

时间:2016-12-02 14:14:35

标签: java time java-8

我想改变一个瞬间的时间:

Instant instant = Instant.parse("2016-03-23T17:14:00.092812Z");
LocalTime newTime = LocalTime.parse("12:34:45.567891");
instant.with(newTime);

我期望在相同的日期获得一个瞬间,但新的时间,即2016-03-23 12:34:45.567891。

但它引发了异常:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: NanoOfDay
    at java.time.Instant.with(Instant.java:720)
    at java.time.Instant.with(Instant.java:207)
    at java.time.LocalTime.adjustInto(LocalTime.java:1333)
    at java.time.Instant.with(Instant.java:656)

任何想法如何解决?

2 个答案:

答案 0 :(得分:4)

“即时”没有本地日历日期或本地时间的概念。其方法toString()描述了UTC时间轴上的日期和时间偏移UTC + 00的时刻:00,但它仍然是一个时刻,而不是具有当地背景的信息。

但是,您可以使用以下转换。转换为本地时间戳,操纵本地时间戳,然后转换回即时/时刻。 看到转换取决于具体的时区非常重要。

Instant instant = Instant.parse("2016-03-23T17:14:00.092812Z");
LocalTime newTime = LocalTime.parse("12:34:45.567891");

// or choose another one, the conversion is zone-dependent!!!
ZoneId tzid = ZoneId.systemDefault(); 
Instant newInstant =
    instant.atZone(tzid).toLocalDate().atTime(newTime).atZone(tzid).toInstant();
System.out.println(newInstant); // 2016-03-23T11:34:45.567891Z (in my zone Europe/Berlin)

答案 1 :(得分:3)

立即设置时间并没有多大意义。您需要一个时区来设置时间。将Instant转换为ZonedDateTime,选择时区。然后在ZonedDateTime上设置时间。然后将ZonedDateTime转换为Instant:

假设时间是UTC时区:

Array<string>