ISO 8601 Java 中的时间间隔解析java.time

2022-09-01 08:13:40

ISO 8601 定义了表示时间间隔的语法。

有四种方法可以表示时间间隔:

  • 开始和结束,如“2007-03-01T13:00:00Z/2008-05-11T15:30:00Z”
  • 开始和持续时间,例如“2007-03-01T13:00:00Z/P1Y2M10DT2H30M”
  • 持续时间和结束,如“P1Y2M10DT2H30M/2008-05-11T15:30:00Z”
  • 仅持续时间,例如“P1Y2M10DT2H30M”,以及其他上下文信息

如果结束值中缺少任何元素,则假定它们与开始值(包括时区)相同。该标准的这一功能允许时间间隔的简洁表示。例如,两小时会议的日期(包括开始和结束时间)可以简单地显示为“2007-12-14T13:30/15:30”,其中“/15:30”表示“/2007-12-14T15:30”(与开始日期相同的日期),或每月计费周期的开始日期和结束日期显示为“2008-02-15/03-14”,其中“/03-14”表示“/2008-03-14”(与开始年份相同)。

此外,重复间隔是通过在间隔表达式的开头添加“R[n]/”来形成的,其中R用作字母本身,[n]被重复次数替换。省略 [n] 的值意味着无限的重复次数。因此,要从“2008-03-01T13:00:00Z”开始重复“P1Y2M10DT2H30M”的间隔五次,请使用“R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M”。

我正在寻找一个好的Java解析器(如果可能的话与Joda-Time库兼容)来解析这种语法。任何指向一个好库的指针?


答案 1

java.time

Java 8 及更高版本中内置的 java.time 框架具有用于解析 ISO 8601 格式持续时间的 Duration.parse 方法:

java.time.Duration d = java.time.Duration.parse("PT1H2M34S");
System.out.println("Duration in seconds: " + d.get(java.time.temporal.ChronoUnit.SECONDS));

指纹Duration in seconds: 3754


答案 2

对于项目中可能被限制使用第三方库(许可原因或其他原因)的任何人,Java本身至少提供了此功能的一部分,因为Java 1.6(或更早版本?)使用javax.xml.datatypeFactory.newDuration(String)方法和持续时间类。这些类用于 XML 操作,但由于 XML 使用 ISO 8601 时间表示法,因此它们还可以用作方便的持续时间分析实用程序。

例:

import javax.xml.datatype.*;

Duration dur = DatatypeFactory.newInstance().newDuration("PT5H12M36S");
int hours = dur.getHours(); // Should return 5

除了您列出的第4个之外,我个人没有使用任何持续时间格式,因此我不能保证它是否成功解析它们。


推荐