ISO 8601 持续时间“P1M”的值是多少(以秒为单位)?

Posted

技术标签:

【中文标题】ISO 8601 持续时间“P1M”的值是多少(以秒为单位)?【英文标题】:What is the value of the ISO 8601 duration `P1M` (in seconds)? 【发布时间】:2014-10-08 20:23:40 【问题描述】:

假设我有一个 ISO 8601 持续时间,表示为 "P1M"。通俗地说,这意味着“一个月”。假设开始日期未知,是否有将其转换为秒数的标准规则?

对于 30 天的月份,可能是 2,592,000。 对于 31 天的月份,可能是 2,678,400。 2 月,可能是 2,419,200,也可能是 2,505,600。

我的直觉是,如果不知道上下文以及这些秒在日历上的位置,就无法将“一个月”解析为确切的秒数。但是是否有标准的规则/约定可以抽象地计算这些持续时间?

【问题讨论】:

【参考方案1】:

根据我找到的 ISO 8601 文档(第 6 页 - http://xml.coverpages.org/ISO-FDIS-8601.pdf),您似乎是正确的,因为无法确定一个月中的秒数。但是它确实注意到“在某些应用程序中,一个月被视为 30 天的时间单位”,因此根据您的应用程序,这可能是一种有效的方法。

“日历时间”(年、月等)和“绝对时间”(小时、分钟、秒等)之间的区别有时很重要。例如,如果他们每 30 天而不是每月支付一次,有些人可能会抱怨几年要支付 13 次抵押贷款。

【讨论】:

【参考方案2】:

您是对的,ISO 8601 持续时间取决于上下文。 持续时间是两个日期之间的时间段/时间间隔。

例子:

2020-01-01/2020-02-01 = P1M = P31D
2020-02-01/2020-03-01 = P1M = P29D
2019-02-01/2019-03-01 = P1M = P28D

如果您想要一个独立于上下文的固定持续时间,请改用日期符号 P30D, P60D, P90D...

这同样适用于多年:

2019-01-01/2020-01-01 = P1Y = P12M = P365D
2020-01-01/2021-01-01 = P1Y = P12M = P366D

如果您无法获得有关持续时间的上下文信息,例如从数据库检索或由用户输入提供的 P1M,则默认使用今天的上下文。

//What is a duration of one month in seconds ?
P1M = ? (no context)
//Use default context
Today = 2020-03-31
2020-03-31/P1M = 2020-03-31/2020-04-31
=> P1M = P30D
//A month contains 2 592 000 seconds

【讨论】:

***有一个例子,即使D 也取决于上下文。 Quote: 在夏令时切换时,“PT36H”与“P1DT12H”不同。 即使是一分钟的秒数也取决于开始日期,因为闰秒导致分钟为 61 秒。

以上是关于ISO 8601 持续时间“P1M”的值是多少(以秒为单位)?的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的 ISO 8601 时间间隔解析

ISO 8601 重复间隔

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

java 转储TimeZone信息,以ISO8601 FULL中的当前时间为例

Spring Boot 问题使用 Jackson 序列化 java.time.LocalDateTime 以返回 ISO-8601 JSON 时间戳?

将时区偏移量(ISO 8601 格式)添加到原始日期时间