Date 如何将月份转换为其他持续时间度量类型?

Date 如何将月份转换为其他持续时间度量类型?,date,datetime,calendar,duration,date-arithmetic,Date,Datetime,Calendar,Duration,Date Arithmetic,对于某些与持续时间相关的计算,我需要将以“月”为单位测量的值转换为其他格式,例如年、天或小时 例如,用天来衡量一个月的正确方法是什么?现在是30天吗?还是30.4375天(365.25/12)在哪些情况下,哪种格式有用 如果您有任何关于此类转换的临时/业务用例的信息,也会很有帮助。不幸的是,您的问题实际上没有一个普遍有效的答案 如果这是用于商业用途,首先检查是否有任何现有的相关标准或商业实践定义了“月”在您的商业环境中的含义。如果是的话,你应该尽可能地遵循这个定义,不管它看起来多么愚蠢或尴尬 对

对于某些与持续时间相关的计算,我需要将以“月”为单位测量的值转换为其他格式,例如年、天或小时

例如,用天来衡量一个月的正确方法是什么?现在是30天吗?还是
30.4375
天<代码>(365.25/12)在哪些情况下,哪种格式有用


如果您有任何关于此类转换的临时/业务用例的信息,也会很有帮助。

不幸的是,您的问题实际上没有一个普遍有效的答案

如果这是用于商业用途,首先检查是否有任何现有的相关标准或商业实践定义了“月”在您的商业环境中的含义。如果是的话,你应该尽可能地遵循这个定义,不管它看起来多么愚蠢或尴尬

对于临时使用,最简单的解决方案可能是选择任何广泛使用的日期操纵库并执行它所做的任何操作。默认行为可能并不完美,但它可能至少接近于一个相当合理的折衷方案,即这样一个库的用户可能有许多相互矛盾的期望

好吧,但如果你坚持推出自己的解决方案呢?在这种情况下,您应该做的第一个选择是如何表示日期/时间值。至少有两种常见的选择:

  • 第一个选项是使用给定历元的固定时间单位的简单线性计数来存储日期/时间,例如或。这提供了一种简单而紧凑的日期/时间表示,使得比较时间戳和简单的日期/时间算法(如向时间值添加n秒)变得容易,并确保任何时间值都对应于(或多或少)唯一且定义良好的时间点

    正如您所注意到的,缺点是使用“模糊”时间单位(如月或年)的算术变得困难:您可以将一年定义为365.25天(或365.2425天,考虑到每400年中只有97年是闰年),将一个月定义为1/12年,但这将导致在日期时间值上添加一年,也会使一天中的时间偏移(约)6小时,这可能是意外的

    这种方法也不允许您轻松地表示“浮动”时间值,比如没有指定日期和时区的时间。(你可以用UTC做时间数学,假装它在你的本地时区,以此来处理浮动时区,但这可能会导致DST转换时发生奇怪的事情。)相反,如果你需要表示不精确的日期/时间值,例如没有时间成分的日期,也会造成困难

    特别是,如果您选择“自然”表示法,其中不精确的日期时间由其起点表示,例如,一天中未指定的时间默认为
    00:00:00.0
    ,则任何导致时间部分减少一秒的因素,例如,移动到更晚的时区,或者减去一个不是整数天的模糊时间单位,将日期部分翻转到前一天。例如,使用此表示法,从2014年1月1日减去一年(=265.2425天)将得到2012年的日期(具体来说,
    2012年12月31日,17:56:32

    您可以通过用中点表示不精确的日期/时间值来避免这些问题,例如,日期
    2014
    被视为
    2014年6月2日12:00:00
    的缩写。使用此表示法,您失去的是仅通过添加组件来构建日期时间的能力:使用此表示法,
    2014
    +
    5个月
    +
    3天
    距离2014年5月3日不远

    而且,当你认为你至少已经明确地整理出了简单的非模糊时间算法时,有人会告诉你

  • 另一种方法是以分解的年/月/日/小时/分钟/秒/等格式存储日期时间值。通过这种表示,时间间隔也自然地以分解格式存储:“一个月+17天”本身就是这种表示中的有效时间间隔,不需要(也不应该)进一步简化

    这有几个明显的优点:

    • 模糊单位算法(概念上)很简单:要给一个日期加上一年,只需将年份分量增加一

    • 可以自然地表示不精确的日期/时间值:对于纯日期值,一天中的时间组件可以不定义(=例如,对于未定义的组件,用负值表示,或者让每个日期时间值存储其精度)

    • 您可以精确控制何时以及是否发生展期:在2014年的某个日期上加上一年将始终产生2015年的某个日期

    • 您还可以支持浮动时间值,例如没有指定日期的时间或没有指定年份的日期。浮动时区也变得可以支持

    尽管如此,也存在一些缺点:

    • 实现日期算法变得更加复杂,因为您必须处理非平凡的进位/借位规则。(快!2014年5月3日之后10000000秒的日期是什么?)

    • 你仍然会对月份的计算有歧义:1月31日后一个月的日期是什么?这是否取决于它是否是闰年

    您可以允许这种格式存储“不可能”的日期,如“2月31日”,并使用可选方法将其标准化为2月28日(或闰年的29日)。这具有保持(某些)算术一致性的优点:它允许
    (1月31日+1个月)+1个月等于预期的3月31日

    在某些方面,尽管这只是推迟了