因此,我希望这段代码能够在新的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
iso_instant
格式化程序在这里进行了说明--“这是一个特例格式化程序,旨在允许即时的人类可读形式”。因此,此格式化程序用于即时
而不是ZonedDateTime
。
格式化时,iso_instant
可以格式化任何能够提供chronofield.instant_seconds
和chronofield.nano_of_second
的时态对象。instant
和ZonedDateTime
都可以提供这两个字段,因此都可以工作:
// 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_seconds
和chronofield.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_TIME
、ISO_OFFSET_DATE_TIME
和ISO_DATE_TIME
的文档(这三个文件中的任何一个都可以用来解析ZonedDateTIME
,而无需指定withzone()
)。
ISO_instant
格式化程序是一个特例格式化程序,设计用于instant
。如果使用的是ZonedDateTime
,则应使用不同的格式化程序,如ISO_DATE_TIME
或ISO_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而编写的。