Joda-Time:Period,Interval和Duration之间有什么区别?

时间:2010-04-16 14:16:43

标签: java jodatime

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

  • Period
  • Interval
  • Duration

    1. 为什么我们需要三个班级?

    2. 哪一个表现更好?

    3. 为什么划分期间或持续时间或间隔实例未实现?例如。 p = p.divideBy(2);

2 个答案:

答案 0 :(得分:240)

需要3个类,因为它们代表不同的概念,因此需要为工作选择合适的类而不是相对性能。来自documentation,我在斜体中添加了评论:


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

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

Joda-Time中的期间表示根据字段定义的时间段,例如,3年5个月2天和7小时。这与持续时间的不同之处在于它以毫秒为单位是不精确的。通过指定相对于的时刻(包括时间顺序和时区),只能将句点解析为精确的毫秒数。 e.g。考虑1年的时间,如果我们将其添加到1月1日,我们将始终在1月1日到达,但持续时间将取决于干预年是否是闰年。同样地,如果我们将1个月添加到1个月的第1个月,那么我们将在下个月的第1个月到达,但持续时间(以毫秒为单位)将根据所讨论的月份而变化


对于问题3,确实不需要划分持续时间的特定方法,因为我们总是可以从long(使用getMillis())获得持续时间内的毫秒数,除以它并构造新的持续时间(使用new Duration(long duration))。

基于上述期间的定义,划分期间并不具有真正意义。例如什么是半个月? (它的长度取决于哪个月)。

答案 1 :(得分:87)

添加到mikej's answer

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)

I2=(2010/3/3 21:00:00.000 UTC ; 2010/3/3 22:00:00.000 UTC)

作为时间间隔,I1I2是不同的,因为端点不同;但如果我将它们转换为持续时间,我会得到同样的结果:3600000 milliseconds

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

最后,期间是“民用时间”的流逝,表示为月,日,小时等。它本身并不代表“物理”间隔,因此它不能直接转换为持续时间(月份有可变长度......)。

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