无法在Java中使用DateTimeFormatter和ZonedDateTime从Temporal

2019-05-11 22:41发布

我最近搬到到Java 8,希望更方便地处理本地和分区倍。

但是,解析一个简单的日期,当我面临的,在我看来,简单的问题。

public static ZonedDateTime convertirAFecha(String fecha) throws Exception {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            ConstantesFechas.FORMATO_DIA).withZone(
            obtenerZonaHorariaServidor());

    ZonedDateTime resultado = ZonedDateTime.parse(fecha, formatter);
    return resultado;
}

在我的情况:

  • 日期星是'15 / 06 / 2014'
  • ConstantesFechas.FORMATO_DIA是“日/月/年”
  • obtenerZonaHorariaServidor返回ZoneId.systemDefault()

所以,这是一个简单的例子。 然而,解析抛出此异常:

java.time.format.DateTimeParseException: Text '15/06/2014' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 2014-06-15 of type java.time.format.Parsed

有小费吗? 我一直在试图解析和使用TemporalAccesor的不同组合,但没有任何运气至今。

最好的祝福

Answer 1:

我不知道为什么它不工作(可能是因为你的投入没有时间/时区信息)。 一个简单的方法是解析您的日期作为LocalDate第一(没有时间或时区信息),然后创建一个ZonedDateTime

public static ZonedDateTime convertirAFecha(String fecha) {
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
  LocalDate date = LocalDate.parse(fecha, formatter);

  ZonedDateTime resultado = date.atStartOfDay(ZoneId.systemDefault());
  return resultado;
}


Answer 2:

这是一个错误,请参阅JDK-错误日志 。 根据该信息的问题解决了对Java 9和Java 8u20。 尝试下载最新的Java 8 - 版本。 今天在2014年5月12日:有一个早期版本的访问8u20可用。

更新:

我个人认为,因为你只有和期望“DD / MM / YYYY”的模式,你应该使用LocalDate为您的主要类型为@assylias已经提出。 关于你提到的情况下,这几乎是肯定有设计没有使用ZonedDateTime 。 你想要什么这种类型的对象呢? 我只能想到专门时区计算的使用案例。 你甚至不能直接存储这些ZonedDateTime -objects在数据库中,所以这种类型的几乎没什么用处不是很多人都相信。

我形容为您的使用情况确实问题与Java 8引入了一个新的方面较老GregorianCalendar -class(这是一个所有功能于一身的类型)。 用户可以开始考虑选择适合他们的问题和使用情况的正确时间类型。



Answer 3:

简单地说,行

ZonedDateTime.parse('2014-04-23', DateTimeFormatter.ISO_OFFSET_DATE_TIME)

抛出一个异常:

Text '2014-04-23' could not be parsed at index 10
java.time.format.DateTimeParseException: Text '2014-04-23' could not be parsed at index 10

它看起来就像是我的错误。

我用这个解决方法:

String dateAsStr = '2014-04-23';
if (dateAsStr.length() == 10) {
    dateAsStr += 'T00:00:00';
}
ZonedDateTime.parse(dateAsStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.systemDefault()));


Answer 4:

只是一个例子转换,我相信有些人会得到下面的异常

(java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2014-10-24T18:22:09.800Z of type java.time.Instant)

如果他们试图

LocalDateTime localDateTime = LocalDateTime.from(new Date().toInstant());

为解决该问题,请通过在区域 -

LocalDateTime localDateTime = LocalDateTime.from(new Date()
        .toInstant().atZone(ZoneId.of("UTC")));


Answer 5:

如果从谷歌来:

而不是做的:

ZonedDateTime.from(new Date().toInstant());

试试这个:

ZonedDateTime.ofInstant(new Date(), ZoneId.of("UTC")); 


文章来源: Unable to obtain ZonedDateTime from TemporalAccessor using DateTimeFormatter and ZonedDateTime in Java 8