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

Java:解析ISO_DATE/ISO_OFFSET_DATE

魏俊茂
2023-03-14

对于REST web服务,我需要返回带有时区的日期(没有时间)。

DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE;
ZonedDateTime dateTime = ZonedDateTime.now();
String formatted = dateTime.format(formatter);
ZonedDateTime parsed = ZonedDateTime.parse(formatted, formatter);

...导致异常:

java.time.format.DateTimeParseException:无法分析文本“2018-04-19+02:00”:无法从TemporalAccessor获取ZonedDateTime:{offsetSeconds=7200},ISO解析为java.time.format.Parsed类型的2018-04-19

我还尝试了iso_date并遇到了同样的问题。

我如何分析这样一个分区的日期?
或者(在Java Time API中)是否有任何其他类型可以用于分区日期?

共有1个答案

邰胤
2023-03-14

问题是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

您的解决方案也能正常工作,但唯一的问题是您要解析两次输入(每次调用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

使用此解决方案,输入只解析一次。

 类似资料:
  • 问题内容: 我需要解析一个XML流。由于我只需要做一次就可以构建我的java对象,因此SAX看起来很自然。我正在扩展DefaultHandler并实现startElement,endElement和character方法,在我的类中具有保存当前读取值(在characters方法中使用)的成员。 我可以轻松完成所需的工作,但是我的代码变得相当复杂,并且我确信没有理由这样做,并且我可以做不同的事情。我

  • 问题内容: 我正在开发一个从网站上抓取数据的应用程序,我想知道应该如何获取数据。具体来说,我需要包含在使用特定CSS类的许多div标签中的数据-目前(出于测试目的)我只是在检查 在HTML的每一行中-都可以,但是我不禁感到有更好的解决方案。 有什么好方法可以给类添加一行HTML并提供一些好方法,例如: 问题答案: “ JTidy是HTML Tidy的Java端口,HTML Tidy是HTML语法检

  • 问题内容: 我有一个愚蠢的问题。 我有这行代码,但是我不明白为什么这个日期无法用这种格式解析。 问题答案: 如果您的系统使用英语以外的语言环境,则需要使用以下构造函数: 如果这不是问题,则应使用相同的格式化程序格式化日期,然后将输出与输入字符串进行比较。

  • 主要内容:1 LinkedBlockingQueue的概述,2 LinkedBlockingQueue的原理,2.1 主要属性,2.2 构造器,2.3 入队操作,2.4 出队操作,2.5 检查操作,2.6 size操作,2.7 迭代操作,3 LinkedBlockingQueue的总结基于JDK1.8详细介绍了LinkedBlockingQueue的底层源码实现,包括锁分离的原理,以及入队列、出队列等操作源码。实际上LinkedBlockingQueue的源码还是非常简单的! 1 LinkedB

  • 主要内容:1 ArrayBlockingQueue的概述,2 ArrayBlockingQueue的原理,2.1 主要属性,2.2 构造器,2.3 入队操作,2.4 出队操作,2.5 检查操作,2.6 size操作,3 ArrayBlockingQueue的总结基于JDK1.8详细介绍了ArrayBlockingQueue的底层源码实现,包括逻辑环形数组的原理,以及入队列、出队列等操作源码。实际上ArrayBlockingQueue的源码还是非常简单的! 文章目录 1 ArrayBlocking

  • 主要内容:1 ConcurrentSkipListSet的概述,2 ConcurrentSkipListSet的实现,2.1 基本结构,2.2 API方法基于JDK1.8详细介绍了ConcurrentSkipListSet的底层源码实现,实际上就是对ConcurrentSkipListMap的包装! 1 ConcurrentSkipListSet的概述 public class ConcurrentSkipListSet < E > extends AbstractSet < E > imple