如何按照ISO 8601开始/结束在PHP中简洁地格式化时间间隔?

问题描述:

我想将时间间隔表示为开始/结束,但同时还要利用ISO 8601似乎允许的缩写:对于与起始点相同的间隔结束字段。例如,现在开始并持续一周的时间间隔为2016-06-08T12:27Z/15T12:27(注意省略了第二个“2016-06-”)。如何按照ISO 8601开始/结束在PHP中简洁地格式化时间间隔?

为了防止潜在的XY问题猜测:我不要希望这个间隔表示为2016-06-08T12:27Z/P1W,即使它更短。我想do想要直接表示结束时间,但尽可能缩写。

我不认为DatePeriod做我想要的 - 是吗?它似乎要么做一半的工作(独立开始和结束,不可能缩写)或错误的工作(返回一个持续时间,而不是结束时间)。

+0

PHP假设您有以上日期格式的完全控制。输出日期时只需指定您想要的格式。没有什么特别的事情需要完成。 –

+0

@JohnConde我不能指定一个静态格式,因为我不知道先验哪些字段将是相同和成熟的遗漏。 IOW我无法静态地知道我的“所需格式”(根据类strftime函数)是什么。 –

我不明白你的问题。但对于周期的短记录:

制作绳2016-06-08T12:27Z/2016-06-15T12:27

,并通过简单的正则表达式酌减:

^(.+)\b(.+)\/\1(.+) to \1\2/\3 => 2016-06-08T12:27Z/15T12:27 

demo

UPDATE

共同作用的结果测试

^(.*)(?:\b|T)(.*Z)\/\1(.+)Z$ 

demo

+0

这是骇人听闻的,但我倾向于喜欢的那种骇人听闻(“少即是多”哲学)。在我接受之前,让我反思一下,以确定我灵魂的代价。从来没有想过重复它!一个想法:2016-06-08T12:27Z/2016-07-15T12:27Z失败。虽然可能不难解决,但在某处添加了明智的\ b。 –

+0

失败?你在跟踪Z吗?只需将Z添加到模式的末尾 – splash58

+0

您的正则表达式替换2016-06-08T12:27Z/2016-07-15T12:27Z更改为2016-06-08T12:27Z/7-15T12:27Z。应该是2016-06-08T12:27Z/07-15T12:27Z(零填充月份)。十月至十二月在实质上是错误的,而不仅仅是在信中。但没有什么大不了的; (。+)\ b(。+)\/\ 1(。+)似乎有诀窍。 –