首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java8中无法使用DateTimeFormatter和ZonedDateTime从TemporalAccessor获取ZonedDateTime

在Java8中无法使用DateTimeFormatter和ZonedDateTime从TemporalAccessor获取ZonedDateTime
EN

Stack Overflow用户
提问于 2014-05-12 02:45:27
回答 5查看 49.6K关注 0票数 56

我最近转到了Java 8,希望能更容易地处理本地和分区时间。

然而,在我看来,在解析一个简单的日期时,我面临着一个简单的问题。

代码语言:javascript
复制
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 is 'dd/MM/yyyy'

  • obtenerZonaHorariaServidor ZoneId.systemDefault()

  • fecha is ZoneId.systemDefault()

is

  • ZoneId.systemDefault()

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

java.time.format.DateTimeParseException:无法分析文本'15/06/2014‘:无法从ZonedDateTime获取TemporalAccessor:{},ISO已解析为java.time.format.Parsed类型的2014-06-15

有什么建议吗?我已经尝试过解析和使用TemporalAccesor的不同组合,但到目前为止还没有成功。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-05-12 02:54:32

这不起作用,因为您的输入(和格式化程序)没有时区信息。一种简单的方法是首先将日期解析为LocalDate (没有时间或时区信息),然后创建一个ZonedDateTime

代码语言:javascript
复制
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;
}
票数 57
EN

Stack Overflow用户

发布于 2014-05-12 17:43:14

这是一个错误,请参阅JDK-bug-log。根据这些信息,这个问题在Java 9和Java 8u20中得到了解决。尝试下载最新的Java 8版本。今天2014-05-12:有一个early access release 8u20可用。

更新:

我个人认为,既然你只有并期望"dd/MM/yyyy“作为模式,那么你应该使用LocalDate作为你的主要类型,正如@assylias已经提出的那样。考虑到您的环境,几乎可以肯定使用ZonedDateTime是设计上的失败。您希望如何处理此类型的对象?我只能把专门的时区计算看作是用例。而且您甚至不能将这些ZonedDateTime-objects直接存储在数据库中,因此这种类型远没有许多人认为的那么有用。

我所描述的用例问题实际上是与旧的GregorianCalendar-class (一体式)相比,Java-8引入的一个新方面。用户必须开始考虑为他们的问题和用例选择适当的时间类型。

票数 16
EN

Stack Overflow用户

发布于 2014-12-04 11:36:01

简单地说,这行

代码语言:javascript
复制
ZonedDateTime.parse('2014-04-23', DateTimeFormatter.ISO_OFFSET_DATE_TIME)

抛出异常:

代码语言:javascript
复制
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

对我来说,这看起来像是个bug。

我使用了以下解决方法:

代码语言:javascript
复制
String dateAsStr = '2014-04-23';
if (dateAsStr.length() == 10) {
    dateAsStr += 'T00:00:00';
}
ZonedDateTime.parse(dateAsStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.systemDefault()));
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23596530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档