In Joda-Time 2, what is the difference between the three kinds of time spans:
2 回答
需要 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)
)。
根据上述期间的定义,划分期间并没有真正的意义。例如什么是半个月?(它的长度取决于哪个月)。
要添加到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)
由于区间不同,I1
和I2
也不同,因为端点不同;但如果我将它们转换为持续时间,我会得到同样的结果:3600000 milliseconds
.
(数学类比:区间[10,12]
和[95,97]
是不同的区间,但它们具有相同的长度:“区间长度”映射到持续时间)。
最后,周期是“公民时间”的流逝,表示为月数、天数、小时数等。它本身并不代表“物理”间隔,因此不能直接转换为持续时间(月份的长度可变......)。
这回答了问题 3:您只能将物理时间(持续时间)除以 2。