问题 代表40,000,000秒作为ISO-8601期间


40,000,000秒是462.962天。如果我想将其表示为ISO-8601期间,请使用以下格式:

PnYnMnDTnHnMnS

确定月份和年份的规则是什么?两者都不是精确的术语,标准说它取决于期间的开始日期。

这是有道理的:它使得周期模糊而没有开始日期。是否有任何可接受的使用没有开始日期的期限的方法?


4776
2017-12-14 05:41


起源

你用什么编程语言? - Jan Vorcak
@JánVorčák,编程语言不是问题。该标准没有说明如何在持续时间格式中表示40兆秒 n 年份, n 个月, n 天等等。如何知道多少天 M1D2 是什么?是31 + 2吗?还是30 + 2?或者28 + 2?看来问题就是问题。 - soulseekah
@soulseekah你是对的我很抱歉,我误解了这个问题 - Jan Vorcak
我没有访问标准,但维基百科说“标准不禁止持续时间表示中的日期和时间值超过其”结转点“,除非如下所述。因此,”PT36H“可以使用以及“P1DT12H”用于表示相同的持续时间。“但是我不知道你是否真的可以找到一个解析4 * 10 ^ 7的库在一段时间内。 - auselen
提醒:即使考虑开始日期时间(如你所知,IMO),你必须决定如何处理闰秒。 - Walter Tross


答案:


好吧,我们来点订单:

标准支持两种类型:   日期 作为从0000年到9999年的特定时间点。
要么   持续时间 这可能描述两个日期之间的时间跨度或仲裁器持续时间/时间跨度不在两个特定日期之间。幸运的是,当你指定持续时间时,标准比日期更灵活:)

那么我们如何区分日期和仲裁时间之间的持续时间呢?
简单: 如果你指定一年的“P1Y” - 这正是你得到的。
如果你想计算这1年的天数 - 这将取决于你应用这一年的开始日期。
例如,如果说开始日期是2010年1月1日(因此2月有28天这是正常的),您的1年计算值将会产生 365 天。 但是,如果说开始日期是2012年1月1日(因此2月因闰年而有29天),那么您的1年价值将会产生 366 天里......

但在这两种情况下,你想要1年 - 而你有1年。因此,第一件事是不要在你的情况下使用多年,因为你真正想要的是在几秒钟内指定相当于40000000 - 只是很快......所以我们的下一个选择是在几天内指定它而.962作为一个一天的一部分:

40000000秒是462天,23小时,6分40秒 根据我在ISO-8601中读到的内容,可以将其指定为持续时间: “P462DT23H6M40S” 或者您可以简单地指定 “PT40000000S” 甚至 “P462.962D”  - 一切都在持续时间。

为了减轻计算的痛苦,你可以使用这个非常简单的C#Line:
var timespan = new TimeSpan(0, 0, 40000000); 
只需在它之后放一个断点,然后查看Timespan类为您计算的内部结构。
在那之后,将这些放入ISO-8601格式是相当容易的。

哦,最后一件事 - 是的,你也可以指定分数 - 例如“P0.5Y”来指定半年。


9
2017-12-17 00:57



有趣。所有实现都支持这个标准吗?将解析所有实现 PT40000000S 是否正确? - soulseekah
我不知道标准的所有实现,并且人们可能会选择仅采用标准的一部分来满足他们的需求 - 把它放在一边,如果实现声称支持ISO-8601它应该能够解析PT40000000S或标准中描述的任何其他变体,否则它不完全支持该标准。 - G.Y
闰秒怎么样? - Mike
@Mike闰秒也支持..如果在Seconds部分中指定60而不是59,则将其视为闰秒。 - G.Y
我的意思是,就像1Y的持续时间取决于开始日期一样,1D(甚至1M)的持续时间(以秒为单位)取决于开始时刻。因此,表示恰好4千万秒的持续时间的唯一方法是PT40000000S。 - Mike


当我阅读(免费提供的文档)标准时,第一个问题的答案

确定月份和年份的规则是什么?

......是没有规则,因为(正如你所注意到的)没有开始日期/时间或持续时间是不可能的。因此,需要上下文。

至于你的第二个问题,

是否有任何可接受的使用没有开始日期的期限的方法?

绝对:看 Unix时间。在Unix时间,40,000,000秒将表示为 40000000

很容易转换,我甚至不用使用计算器! ;)

编辑:

一个(不完美的)类比:

仅使用公制系统,从伦敦到芝加哥有多远?度量系统定义为表示此距离的最佳/最准确方法是什么?

那么,公制系统定义了我们可以使用的长度/距离单位:米。

问题是度量系统根本不解决所涉及的变量。我们是否考虑到了地球的曲率?这是一条几何直线,这是“像乌鸦一样”,这是使用可用公共路线和已知飞行路径确定的行程距离吗?

答案是那里  没有更多的背景,没办法做到这一点。


2
2017-12-17 00:06



Unix时间有隐含的开始日期。 Op正在询问如何解决需要的问题。 - oakad
@oakad我知道;阅读第二个问题。我所说的是,如果不使用估算值或平均值,就无法解决需求。 Unix时间 - 因为单位只是秒 - 可以用来明确地表示没有开始日期的时间间隔。无需转换月长或任何其他时间单位。隐含的开始日期是什么并不重要。 OP没有明确提出问题“如何仅使用ISO-8601”,但答案是它不能。 - klugerama


正如G.Y.的另一个答案中所提到的,并非所有年份都是相同的天数。如果你要转换为几天也是如此 - 并非所有日子都是24小时。最经常发生的地方是在跨越夏令时时间边界的时段内,使时间段关闭一小时(当然,如果它超过偶数个边界,则错误取消)。

可能出现的第二个位置是当时段跨越月末边界时,因为您可以获得或失去闰秒。同样,这种情况很少发生在大多数业务应用程序中,并且通常会被忽略,但如果您协调多个与世界时钟同步的系统,则可能会出现问题。


1
2018-01-15 19:49