93

我在尝试转换java.util.Datejava.time.LocalDate.

java.time.DateTimeException: Unable to obtain ZonedDateTime from TemporalAccessor: 2014-08-19T05:28:16.768Z of type java.time.Instant

代码如下:

public static Date getNearestQuarterStartDate(Date calculateFromDate){

    int[] quaterStartMonths={1,4,7,10};     
    Date startDate=null;

    ZonedDateTime d=ZonedDateTime.from(calculateFromDate.toInstant());
    int frmDateMonth=d.getMonth().getValue();

我使用ZonedDateTime课程的方式有问题吗?

根据文档,这应该将java.util.Date对象转换为ZonedDateTime. 上面的日期格式是标准日期吗?

我必须回退到 Joda 时间吗?

如果有人可以提供一些建议,那就太好了。

4

4 回答 4

128

将 an 转换Instant为 a ZonedDateTimeZonedDateTime提供方法ZonedDateTime.ofInstant(Instant, ZoneId)。所以

所以,假设你想ZonedDateTime在默认时区,你的代码应该是

ZonedDateTime d = ZonedDateTime.ofInstant(calculateFromDate.toInstant(),
                                          ZoneId.systemDefault());
于 2014-08-19T06:12:43.890 回答
43

要从 Date 获取 ZonedDateTime,您可以使用:

calculateFromDate.toInstant().atZone(ZoneId.systemDefault())

toLocalDate然后,如果您需要 LocalDate,您可以调用该方法。另请参阅:将 java.util.Date 转换为 java.time.LocalDate

于 2014-08-19T06:36:37.533 回答
10
于 2019-02-21T05:41:44.823 回答
0

在以 UTC 存储 util.Date 的 Java 10 上,答案对我不起作用。

Date.toInstant() 似乎将 EpochMillis 转换为服务器的本地时区。

ZDT.ofInstant(instant, zoneId) 和 instant.atZone(zoneId) 似乎只是在瞬间标记一个 TZ,但它已经搞砸了。

我找不到阻止 Date.toInstant() 将 UTC 时间与系统时区混淆的方法。

我发现解决这个问题的唯一方法是通过 sql.Timestamp 类:

new java.sql.Timestamp(date.getTime()).toLocalDateTime()
                                      .atZone(ZoneId.of("UTC"))
                                      .withZoneSameInstant(desiredTZ)
于 2019-02-21T01:37:00.650 回答