我最近搬到到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的不同组合,但没有任何运气至今。
最好的祝福
我不知道为什么它不工作(可能是因为你的投入没有时间/时区信息)。 一个简单的方法是解析您的日期作为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;
}
这是一个错误,请参阅JDK-错误日志 。 根据该信息的问题解决了对Java 9和Java 8u20。 尝试下载最新的Java 8 - 版本。 今天在2014年5月12日:有一个早期版本的访问8u20可用。
更新:
我个人认为,因为你只有和期望“DD / MM / YYYY”的模式,你应该使用LocalDate
为您的主要类型为@assylias已经提出。 关于你提到的情况下,这几乎是肯定有设计没有使用ZonedDateTime
。 你想要什么这种类型的对象呢? 我只能想到专门时区计算的使用案例。 你甚至不能直接存储这些ZonedDateTime
-objects在数据库中,所以这种类型的几乎没什么用处不是很多人都相信。
我形容为您的使用情况确实问题与Java 8引入了一个新的方面较老GregorianCalendar
-class(这是一个所有功能于一身的类型)。 用户可以开始考虑选择适合他们的问题和使用情况的正确时间类型。
简单地说,行
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()));
只是一个例子转换,我相信有些人会得到下面的异常
(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")));
如果从谷歌来:
而不是做的:
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