在Joda-Time 2中,三种时间跨度之间有什么区别:

间隔

持续时间

为什么我们需要三堂课?

哪个表现更好?

为什么不实现对Period,Duration或Interval实例的划分? 例如。p = p.divideBy(2);

请注意,此日期时间术语尚未标准化(尚未)。 ISO-8601标准的持续时间概念是Joda-Time认为的Period。 已经提出了使这种术语标准化的提议,但是尚未完成。

需要3个类,因为它们表示不同的概念,因此要针对工作选择合适的类,而不是相对的性能。在文档中,我以斜体添加了注释:

Joda-Time中的间隔表示从一毫秒瞬间到另一瞬间的时间间隔。这两个时刻都是日期时间连续体中完全指定的时刻,并带有时区。定义了特定时间,例如这可能是昨天20:00:00GMT和今天早上09:00:00GMT之间的时间间隔。

Joda-Time中的持续时间表示以毫秒为单位的持续时间。持续时间通常是从一个间隔中获得的。即我们可以从间隔的结尾减去开始以得出持续时间

Joda-Time中的时间段表示根据字段定义的时间段,例如3年5个月2天和7小时。这与持续时间的不同之处在于,它以毫秒为单位不精确。通过指定相对的瞬间(包括时间和时区),只能将一个时期解析为精确的毫秒数。例如考虑一年的期限,如果将其添加到1月1日,我们将始终到达下一个1月1日,但是持续时间取决于中间年份是否为a年。同样,如果我们在一个月的1号加上1个月,那么我们将在下个月的1号到达,但是持续时间(以毫秒为单位)将根据相关月份而有所不同

对于问题3,确实没有必要使用特定的方法来划分持续时间,因为我们总是可以将持续时间的毫秒数作为long(使用getMillis())进行除法并构造新的持续时间(使用)。

根据上述期间的定义,划分期间实际上并没有真正的意义。例如什么是半个月? (其长度取决于哪个月)。

我认为划分时间段确实有其含义-半个月仍然是有效的时间单位,但是它需要一个开始日期才能确切知道多长时间(以完全相同的方式,一个月就是一个有效时间段)。

Jodatime认为周期是INTEGER值字段的元组,它不允许小数。多数民众赞成在与通用(民用)一致。实际上,在日常生活中没有人认为1个月10天除以2是半个月5天。如果需要进行该划分,则可能需要进行一定的时间(物理时间)。

要添加到mikej的答案中:

Joda-Time持续时间是"物理"时间间隔;例如:

12000 milliseconds

Joda-Time间隔实际上是一对瞬间(开始瞬间-结束瞬间)。瞬间又是"物理"概念,即时间轴上的一点。例如(只是一种可能的表示法):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC)

然后,间隔可以转换为持续时间,但不能转换为持续时间。

考虑以下两个间隔:

I1=(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC)

<5233>

作为间隔,I1和I2是不同的,因为端点是不同的。但是如果将它们转换为持续时间,则会得到相同的结果:3600000 milliseconds。

(类比:间隔[10,12]和[95,97]是不同的间隔,但是它们具有相同的长度:"间隔长度"映射到持续时间)。

最后,时间段是经过一段时间后的"民事时间",表示为几个月,几天,几小时等。它本身并不表示"物理"间隔,因此不能直接转换为持续时间(月份的长度可变...)。

这回答了问题3:您只能将一个物理时间(一个持续时间)除以2。

四个月除以两个将是两个月。为什么这样无效?

您将如何计算2个月; 18天除以3?您无法对此类操作获得一致的定义。

我认为您可以获得一致的定义,但是必须将其视为" 2个月零18天"时间的1/3。在将其转换为间隔之前,您将无法确切计算出它是什么。仅因为JODA不支持它并不意味着它无效。

@hadley没有"一天的三分之一"的民事定义。例如。没有合同在一天的三分之一内有效。

@ipavlic,将1天除以3则分别是0d和8h,与将1小时除以3则是0h和20m一样。合同确实考虑了小时,有些(例如严格的SLA)可能要考虑分钟。直到您遇到数月,它都是完全一致的,因为它们是可变的。

由于夏令时,@ Richard Watson Days可以长达23、24或25小时。因此,"从...开始的一天的三分之一"是有效的,但仅"三分之一"是无效的。

嗯谢谢您知道,我生活在一个没有DST的世界中。没有直觉!

如果那是一个没有DST,可变长的月份,leap年和leap秒的世界,那确实听起来是一个令人羡慕的地方!