当前位置: 首页 > 知识库问答 >
问题:

ZonedDateTime的Java8-DateTimeFormatter和ISO_INSTANT问题

湛博易
2023-03-14

因此,我希望这段代码能够在新的Java8date/time包下工作,因为它所做的只是将给定的ZonedDateTime转换成字符串,然后使用相同的内置DateTimeFormatter实例(ISO_INSTANT)返回:

ZonedDateTime now = ZonedDateTime.now();
System.out.println(ZonedDateTime.parse(
    now.format(DateTimeFormatter.ISO_INSTANT),
    DateTimeFormatter.ISO_INSTANT));

但显然不是:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2014-09-01T19:37:48.549Z' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {MilliOfSecond=549, NanoOfSecond=549000000, MicroOfSecond=549000, InstantSeconds=1409600268},ISO of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)

我已经看到了这个条目,但它对我没有帮助,因为a需要一个ZonedDateTime对象,而不是本地对象,还因为我已经安装了8U20:无法使用DateTimeFormatter和Java8中的ZonedDateTime从TemporalAccessor获得ZonedDateTime

共有1个答案

鄢承运
2023-03-14

iso_instant格式化程序在这里进行了说明--“这是一个特例格式化程序,旨在允许即时的人类可读形式”。因此,此格式化程序用于即时而不是ZonedDateTime

格式化时,iso_instant可以格式化任何能够提供chronofield.instant_secondschronofield.nano_of_second的时态对象。instantZonedDateTime都可以提供这两个字段,因此都可以工作:

// works with Instant
Instant instant = Instant.now();
System.out.println(DateTimeFormatter.ISO_INSTANT.format(instant));

// works with ZonedDateTime 
ZonedDateTime zdt = ZonedDateTime.now();
System.out.println(zdt.format(DateTimeFormatter.ISO_INSTANT));

// example output
2014-09-02T08:05:23.653Z

解析时,iso_instant将只生成chronofield.instant_secondschronofield.nano_of_second。可以从这两个字段生成即时,但是ZonedDateTime还需要ZoneID:

要解析ZonedDateTime,必须提供时区ZoneID。时区可以(a)从字符串中解析,或(b)指定给格式化程序(使用JDK 8U20):

// option a - parsed from the string
DateTimeFormatter f = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2014-09-02T08:05:23.653Z", f);

// option b - specified in the formatter - REQUIRES JDK 8u20 !!!
DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.systemDefault());
ZonedDateTime zdt = ZonedDateTime.parse("2014-09-02T08:05:23.653Z", f);

请参见ISO_Zoned_DATE_TIMEISO_OFFSET_DATE_TIMEISO_DATE_TIME的文档(这三个文件中的任何一个都可以用来解析ZonedDateTIME,而无需指定withzone())。

ISO_instant格式化程序是一个特例格式化程序,设计用于instant。如果使用的是ZonedDateTime,则应使用不同的格式化程序,如ISO_DATE_TIMEISO_Zoned_DATE_TIME

 类似资料:
  • 我使用Java8的ZonedDateTime和DateTimeFormatter。当我试图解析自己的模式时,它无法识别并抛出异常。

  • 问题内容: 我最近迁移到Java 8,希望能够更轻松地处理本地时间和分区时间。 但是,我认为在解析一个简单的日期时,我面临着一个简单的问题。 就我而言: fecha是‘15 / 06/2014’ ConstantesFechas.FORMATO_DIA为“ dd / MM / yyyy” obtenerZonaHorariaServidor返回ZoneId.systemDefault() 因此,这

  • 我最近转到Java8,希望能更容易地处理本地和分区时间。 然而,在我看来,在解析一个简单的日期时,我面临着一个简单的问题。 null 这是一个简单的例子。但是,解析会抛出以下异常: java.time.format.DateTimeParseException:无法分析文本“15/06/2014”:无法从TemporalAccessor获取ZonedDateTime:{},ISO解析为类型java

  • 我是java.time包的新手。我有一个本地日期是2015-12-10。我需要将此转换为ZonedDateTime。时间应该是00:00:00,区域是zoneoffset.utc。 dateTimeException:无法从java.time.localDate类型的TemporalAccessor:2015-12-10获取Instant 我也试过: 这会产生意想不到的结果。 我查看了API并尝试

  • 我已经阅读了手册,我完全不知道为什么这段代码不能工作。 最后一行抛出异常:java.time.format.DateTimeParseException:无法解析文本“07/29/2015”:无法从TemporalAccessor获取LocalDate:{YearOfera=2015,DayOfMonth=29,MonthOfYear=7},类型为java.time.Format.Parsed的I

  • 我正在尝试编写一个方法来打印两个ZonedDateTimes之间的时间差,关于时区之间的差异。 我找到了一些解决方案,但它们都是为使用LocalDateTime而编写的。