【问题标题】:Representing 40,000,000 seconds as an ISO-8601 period将 40,000,000 秒表示为 ISO-8601 周期
【发布时间】:2013-12-14 05:41:55
【问题描述】:

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

PnYnMnDTnHnMnS

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

这是有道理的:它使没有开始日期的期间模棱两可。是否有任何可接受的方法来使用没有开始日期的期间?

【问题讨论】:

  • 你使用什么编程语言?
  • @JánVorčák,编程语言在这里不是问题。该标准没有说明如何以n 年、n 月、n 天等持续时间格式表示 40 兆秒。如何知道M1D2 是多少天?是31+2吗?还是 30+2?或者也许是 28+2?这就是问题所要问的,似乎。
  • @soulseekah 你说得对,对不起,我误解了这个问题
  • 我无权访问该标准,但维基百科说“该标准不禁止持续时间表示中的日期和时间值超过其“结转点”,除非如下所述。因此,“ PT36H" 可以与 "P1DT12H" 一样用于表示相同的持续时间。但是我不知道你是否真的能找到一个解析 4*10^7 几秒的库。
  • 提醒:即使考虑到开始日期时间(IMO 应该这样做),您也必须决定如何处理闰秒。

标签: iso8601


【解决方案1】:

好的,让我们整理一下:

标准支持以下两种类型: 日期作为从 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# 行:
var timespan = new TimeSpan(0, 0, 40000000);
只需在其后放置一个断点,然后查看 Timespan 类为您计算的内部结构。
在那之后将它们转换成 ISO-8601 格式就相当容易了。

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

【讨论】:

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

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

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

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

关于第二个问题,

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

当然:见Unix Time。在 Unix 时间中,40,000,000 秒将表示为40000000

相当简单的转换,我几乎不用计算器! ;)

编辑:

一个(不完美的)类比:

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

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

问题在于公制根本没有解决所涉及的变量。我们是否考虑到地球的曲率?这是一条几何直线吗?这是“乌鸦飞”吗?这是使用可用公共路线和已知飞行路径确定的旅行距离吗?

答案是没有更多的上下文就没有办法做到这一点。

【讨论】:

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

正如 G.Y. 在另一个答案中提到的,并非所有年份的天数都相同。如果您要转换为天数,情况也是如此 - 并非所有天数都是 24 小时。这种情况最常发生的地方是在跨越夏令时边界的时间段内,使时间段缩短一个小时(当然,如果它跨越偶数个边界,错误就会取消)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多