提问人:Faliorn 提问时间:5/12/2014 最后编辑:Anton MenshovFaliorn 更新时间:7/21/2021 访问量:73680
无法在 Java 8 中使用 DateTimeFormatter 和 ZonedDateTime 从 TemporalAccessor 获取 ZonedDateTime
Unable to obtain ZonedDateTime from TemporalAccessor using DateTimeFormatter and ZonedDateTime in Java 8
问:
我最近迁移到了 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;
}
就我而言:
- FECHA 是“15/06/2014”
- ConstantesFechas.FORMATO_DIA是“dd/MM/yyyy”
- obtenerZonaHorariaServidor 返回 ZoneId.systemDefault()
所以,这是一个简单的例子。但是,分析会引发以下异常:
java.time.format.DateTimeParseException:文本“15/06/2014”无法 被解析:无法从 TemporalAccessor 获取 ZonedDateTime: {},ISO 解析为 2014-06-15 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-bug-log。根据这些信息,Java 9 和 Java 8u20 的问题得到了解决。尝试下载最新的 Java 8 版本。今天 2014-05-12: 抢先体验版 8u20 可用。
更新:
我个人认为,既然你只有并期望“dd/MM/yyyy”作为模式,你应该使用@assylias已经提出的主要类型。关于您的上下文,几乎可以肯定使用 .您希望如何处理此类型的对象?我只能将专门的时区计算视为用例。而且你甚至不能直接将这些对象存储在数据库中,所以这种类型远没有许多人认为的那么有用。LocalDate
ZonedDateTime
ZonedDateTime
我所描述的用例问题确实是 Java-8 与旧的 -class(一种多合一类型)相比引入的一个新方面。用户必须开始考虑为他们的问题和用例选择适当的时态类型。GregorianCalendar
评论
since you only have and expect "dd/MM/yyyy" as pattern you should use LocalDate
withZone(…)
ZonedDateTime.parse(…)
LocalDate.parse(…)
ZonedDateTime.parse(…)
简单来说,这条线
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")));
如果来自 Google:
而不是做:
ZonedDateTime.from(new Date().toInstant());
试试这个:
ZonedDateTime.ofInstant(new Date(), ZoneId.of("UTC"));
评论
java.time