如何在一个表达式中指定日期和持续时间
问题描述:
我正在尝试为ISO8601格式的周期性事件查找符号。 它可以作为一个表达?如何在一个表达式中指定日期和持续时间
例如,事件开始于2017年3月31日17:25与周期性1小时:
2017-03-31T17:25:00Z/PT1H
试图在Java中该表达解析到Duration
:
java.time.Duration d = java.time.Duration.parse("2017-03-31T17:25:00Z/PT1H");
导致异常。
答
在Iso-8601中,表达“2017-03-31T17:25:00Z/PT1H”不是一个复发间隔,而只是一个正常的瞬间/瞬间间隔。如果你寻找复发间隔,那么你必须用“Rn /”作为前缀,其中“n”是一个正整数(可选)。标准Java有间隔不支持,所以你必须要么使用字符串处理和部分解析代码自己的解决办法,或者你使用第三方库就像我的一个(Time4J):
MomentInterval interval = MomentInterval.parseISO("2017-03-31T17:25:00Z/PT1H");
System.out.println(interval); // [2017-03-31T17:25:00Z/2017-03-31T18:25:00Z)
的时刻又见Javadoc间隔。对于经常性间隔请看这个类IsoRecurrence。
互操作性注意事项:您可以通过方法toTemporalAccessor()
轻松地将Moment
组件转换为java.time.Instant
。
你也应该明白像java.time.Duration这样的时间量不是一个时间间隔,因为即时时间轴上的锚点缺失(没有定义的开始和结束)。因此,这种类型最多只能用于解析第二个组件“PT1H”,而不是更多。 –