40,000,000秒是462.962天。如果我想将其表示为ISO-8601期间,请使用以下格式:
PnYnMnDTnHnMnS
确定月份和年份的规则是什么?两者都不是精确的术语,标准说它取决于期间的开始日期。
这是有道理的:它使得周期模糊而没有开始日期。是否有任何可接受的使用没有开始日期的期限的方法?
40,000,000秒是462.962天。如果我想将其表示为ISO-8601期间,请使用以下格式:
PnYnMnDTnHnMnS
确定月份和年份的规则是什么?两者都不是精确的术语,标准说它取决于期间的开始日期。
这是有道理的:它使得周期模糊而没有开始日期。是否有任何可接受的使用没有开始日期的期限的方法?
好吧,我们来点订单:
标准支持两种类型:
日期 作为从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”来指定半年。
当我阅读(免费提供的文档)标准时,第一个问题的答案
确定月份和年份的规则是什么?
......是没有规则,因为(正如你所注意到的)没有开始日期/时间或持续时间是不可能的。因此,需要上下文。
至于你的第二个问题,
是否有任何可接受的使用没有开始日期的期限的方法?
绝对:看 Unix时间。在Unix时间,40,000,000秒将表示为 40000000
。
很容易转换,我甚至不用使用计算器! ;)
编辑:
一个(不完美的)类比:
仅使用公制系统,从伦敦到芝加哥有多远?度量系统定义为表示此距离的最佳/最准确方法是什么?
那么,公制系统定义了我们可以使用的长度/距离单位:米。
问题是度量系统根本不解决所涉及的变量。我们是否考虑到了地球的曲率?这是一条几何直线,这是“像乌鸦一样”,这是使用可用公共路线和已知飞行路径确定的行程距离吗?
答案是那里 是 没有更多的背景,没办法做到这一点。
正如G.Y.的另一个答案中所提到的,并非所有年份都是相同的天数。如果你要转换为几天也是如此 - 并非所有日子都是24小时。最经常发生的地方是在跨越夏令时时间边界的时段内,使时间段关闭一小时(当然,如果它超过偶数个边界,则错误取消)。
可能出现的第二个位置是当时段跨越月末边界时,因为您可以获得或失去闰秒。同样,这种情况很少发生在大多数业务应用程序中,并且通常会被忽略,但如果您协调多个与世界时钟同步的系统,则可能会出现问题。