ISO 8601 重复间隔

Posted

技术标签:

【中文标题】ISO 8601 重复间隔【英文标题】:ISO 8601 Repeating Interval 【发布时间】:2011-11-12 10:58:46 【问题描述】:

***给出了一个ISO 8601 的例子repeating interval 的例子:

R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M

这就是这个意思:

R5 表示斜线后的间隔重复5次。 2008-03-01T13:00:00Z 表示间隔从这个给定的日期时间开始。 P1Y2M10DT2H30M 表示间隔持续 1 年 2 个月 10 天 2 小时 30 分钟

我的问题是我不知道这里重复了什么。是否重复 间隔结束后立即发生?我可以指定每周一的 13:00 到 14:00 发生一些事情吗?

【问题讨论】:

对于没有特定开始或结束日期的“间隔”,我创建了基于 ISO 8601 的格式。它用于这些 javascriptphp 库中。在您的示例中,“每周一 13:00:00”写为“F1D/WT13H0M0S”。 1h间隔(持续时间)可以独立存储。 @smhg 您是否有概述您的扩展的文档?如果是,我真的很想读,如果不是,我们做一个! 根据 Mu Mind 的回答,我一直在阅读 RFC 5545 的 RRULE(来自 iCalendar)。我的格式取决于用于更高级操作的外部过滤器功能(例如,奇数周每天 10:00:00 的 F(odd)W/ET10H0M0S)。 RRULE 允许您内联指定所有内容,但人类无法阅读(不了解 rfc)。在我的用例中,这是我愿意做出的权衡。所以我将使用这个现有的标准重写这两个库。 【参考方案1】:

标准本身并没有说明,但这里唯一明显的解释是间隔是背靠背重复的。所以这个循环间隔:

R2/2008-03-01T13:00:00Z/P1Y2M10DT2H30M

将等同于这些非重复间隔:

2008-03-01T13:00:00Z/P1Y2M10DT2H30M
2009-05-01T15:30:00Z/P1Y2M10DT2H30M

(注意:我的阅读是重复的次数确实包括第一次出现)

在 ISO 8601 中无法表示“每周一,从 13:00 到 14:00”,但对于 iCalendar 格式的 VEVENT 来说,这是很自然的。 (如果您可以完全在 ISO 8601 内做到这一点,那么这将引发大量进一步的功能请求)

【讨论】:

您如何解释“R2/P1M/2008-03-01T13:00:00Z”(持续时间和结束日期)?你觉得和“R2/2008-02-01T13:00:00Z/P1M”一样吗? 不。这将意味着重复在该日期结束,但会一直持续到过去。 由于指定了[n]的数量,我将其解释为它不会在时间上无限返回。【参考方案2】:

是的,ISO8601 确实定义了一个常规重复间隔(或者像“月”一样常规可以作为单位之一)。

R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M

应该产生这些时间:

2009-05-11T15:30:00Z
2010-07-21T18:00:00Z
2011-10-01T20:30:00Z
2012-12-11T23:00:00Z
2014-02-22T00:30:00Z

它没有像 RFC5545 (iCalendar) 那样定义“开始时间”和“结束时间”,甚至没有像 RRULE 或 crontab 那样定义不规则的重复。

您应该能够使用 ISO 周日期作为起点来指定每周重复,但您需要单独重复“开始”和“结束”时间:

R/2021-W01-1T13:00:00Z/P1W
R/2021-W01-1T14:00:00Z/P1W

第一个间隔是开始时间:星期一 13:00(从 2021 年开始),第二个间隔是结束时间:星期一 14:00(从 2021 年开始)。

【讨论】:

以上是关于ISO 8601 重复间隔的主要内容,如果未能解决你的问题,请参考以下文章

一种将当前日期时间转换为 ISO 8601 格式的优雅方法 [重复]

在Java中将ISO 8601时间戳字符串转换为纪元秒[重复]

Java 中的 ISO 8601 时间间隔解析

从Python中的ISO周数获取日期[重复]

ruby 中是不是有适用于 ISO 8601 的综合库/模块?

DateTimeFormatter用于解析区域偏移的所有ISO有效样式[重复]