【发布时间】:2011-02-08 20:40:00
【问题描述】:
Joda-Time2中,三种时间跨度有什么区别:
【问题讨论】:
Joda-Time2中,三种时间跨度有什么区别:
【问题讨论】:
需要 3 个类,因为它们代表不同的概念,因此选择适合工作的类而不是相对性能的问题。来自documentation,我在斜体中添加了cmets:
Joda-Time 中的 interval 表示从一毫秒瞬间到另一瞬间的时间间隔。这两个瞬间都是日期时间连续体中完全指定的瞬间,并带有时区。 定义了具体时间,例如这可能是昨天 20:00:00 GMT 和今天早上 09:00:00 GMT 之间的时间间隔。
Joda-Time 中的 持续时间 表示以毫秒为单位的持续时间。持续时间通常是从一个间隔中获得的。 即我们可以从间隔的末尾减去 start 以得出持续时间
Joda-Time 中的期间 表示以字段定义的时间段,例如,3 年 5 个月 2 天 7 小时。这与持续时间的不同之处在于它在毫秒方面是不精确的。一个周期只能通过指定它相对的时刻(包括年表和时区)来解析为精确的毫秒数。 例如考虑 1 年的时间段,如果我们将其添加到 1 月 1 日,我们将始终到达下一个 1 月 1 日,但持续时间将取决于中间年份是否为闰年。同样,如果我们在一个月的 1 号加上 1 个月,那么我们将在下个月的 1 号到达,但持续时间(以毫秒为单位)将根据所讨论的月份而有所不同
对于问题3,实际上并不需要划分持续时间的特定方法,因为我们总是可以从持续时间中获取毫秒数作为long(使用getMillis()),划分它并构造一个新的持续时间(使用new Duration(long duration))。
根据上述期间的定义,划分期间并没有真正的意义。例如什么是半个月? (其长度取决于哪个月)。
【讨论】:
添加到mikej's answer:
A Joda-Time duration 是“物理”时间间隔;例如:
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)
作为区间,I1和I2不同,因为端点不同;但如果我将它们转换为持续时间,我会得到同样的结果:3600000 milliseconds。
(数学类比:区间[10,12]和[95,97]是不同的intervals,但是它们有相同的length:"interval length" em> 映射到 duration)。
最后,期间是“公民时间”的流逝,表示为月数、天数、小时数等。它本身并不代表“物理”间隔,因此它不能直接转换为 duration(月份的长度可变...)。
这回答了问题 3:您只能将物理时间(持续时间)除以 2。
【讨论】: