对于 REST Web 服务,我需要返回带时区的日期(无时间).
显然不存在这样的东西ZonedDate
在 Java 中(仅LocalDate
and ZonedDateTime
),所以我用的是ZonedDateTime
作为后备。
将这些日期转换为 JSON 时,我使用DateTimeFormatter.ISO_OFFSET_DATE
格式化日期,效果非常好:
DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE;
ZonedDateTime dateTime = ZonedDateTime.now();
String formatted = dateTime.format(formatter);
2018-04-19+02:00
然而,尝试解析这样的日期......
ZonedDateTime parsed = ZonedDateTime.parse(formatted, formatter);
...导致异常:
java.time.format.DateTimeParseException:无法解析文本“2018-04-19+02:00”:无法从 TemporalAccessor 获取 ZonedDateTime:{OffsetSeconds=7200},ISO 解析为 java 类型的 2018-04-19。时间.格式.解析
我也尝试过ISO_DATE
并遇到了同样的问题。
我如何解析这样的分区日期?
或者是否有任何其他类型(在 Java Time API 内)我应该用于分区日期?
问题是ZonedDateTime
需要构建所有日期和时间字段(年、月、日、小时、分钟、秒、纳秒),但是格式化程序ISO_OFFSET_DATE
生成一个不带时间部分的字符串。
当解析它时,没有与时间相关的字段(小时,分钟,秒),你会得到一个DateTimeParseException
.
解析它的一种替代方法是使用DateTimeFormatterBuilder
并定义时间字段的默认值。正如你所使用的atStartOfDay
在你的回答中,我假设你想要午夜,所以你可以执行以下操作:
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// date and offset
.append(DateTimeFormatter.ISO_OFFSET_DATE)
// default values for hour and minute
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.toFormatter();
ZonedDateTime parsed = ZonedDateTime.parse("2018-04-19+02:00", fmt); // 2018-04-19T00:00+02:00
您的解决方案 https://stackoverflow.com/a/49922704也工作得很好,但唯一的问题是你正在解析输入twice(每次调用formatter.parse
将再次解析输入)。更好的选择是使用parse
没有时间查询的方法(仅解析一次),然后使用解析的对象来获取您需要的信息。
DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE;
// parse input
TemporalAccessor parsed = formatter.parse("2018-04-19+02:00");
// get data from the parsed object
LocalDate date = LocalDate.from(parsed);
ZoneId zone = ZoneId.from(parsed);
ZonedDateTime restored = date.atStartOfDay(zone); // 2018-04-19T00:00+02:00
使用此解决方案,输入仅被解析一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)