ISO 8601持续时间`P1M`的价值是多少秒?

15

假设我有一个ISO 8601持续时间,表示为"P1M"。口语化地说,这意味着 "一个月"。如果假定未知起始日期,是否有将其转换为秒数的标准规则?

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

我的直觉是没有办法在不知道上下文和日历中的秒数的情况下将“一个月”解析为确切的秒数。但是是否有标准规则/惯例以抽象的方式计算这些持续时间?

2个回答

12

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

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


6
你说得没错,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-30
=> P1M = P30D
//A month contains 2 592 000 seconds

1
维基百科有一个例子,即使是 D 也取决于上下文。引用:“PT36H”在从夏令时切换到标准时间或从标准时间切换到夏令时时与“P1DT12H”不同。 - Socowi
即使是每分钟的秒数也取决于起始日期,因为会有闰秒导致出现61秒的分钟。 - Socowi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接