198

In Joda-Time 2, what is the difference between the three kinds of time spans:

  • Period
  • Interval
  • Duration

    1. Why do we need three classes?

    2. Which one performs better?

    3. Why is dividing a Period or Duration or Interval instance not implemented? E.g. p = p.divideBy(2);

4

2 回答 2

256

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


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

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

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


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

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

于 2010-04-16T14:25:45.917 回答
93

要添加到mikej 的答案

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

12000 milliseconds <-- 这是一个持续时间

Joda-Time间隔实际上是一对瞬间(开始瞬间 - 结束瞬间)。瞬间又是一个“物理”概念,时间线中的一个点。例如(只是一个可能的符号):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <-- 这是一个区间

一个interval,然后,可以转换为一个duration,但不能反过来。

考虑这两个区间:

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。

于 2010-04-16T15:18:21.993 回答