在Joda-Time 2中,这三种时间跨度的区别是什么:
为什么我们需要三个类?
哪个表现更好?
为什么划分一个周期或持续时间或间隔实例没有实现?例如p = p.divideBy(2);
p = p.divideBy(2);
需要3个类,因为它们代表不同的概念,所以这是一个为工作选择合适的类,而不是相对性能的问题。从我在斜体中添加的注释文档:
Joda-Time中的时间间隔表示从一个毫秒瞬间到另一个瞬间的时间间隔。这两个瞬间都是datetime连续体中完全指定的瞬间,并带有时区。定义了特定的时间,例如,这可能是昨天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))。
long
getMillis()
new Duration(long duration)
根据上面对周期的定义来划分周期并没有真正的意义。半个月是多少?(它的长度取决于哪个月)。
添加到mikej的回答:
Joda-Time 持续时间是一个“物理”时间间隔;例如:
12000 milliseconds <这是一个持续时间
12000 milliseconds
Joda-Time 时间间隔实际上是一对瞬间(开始即时-结束即时)。即时同样是一个“物理”概念,是时间轴上的一个点。Eg(只是一个可能的符号):
(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <这是一个区间
(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。
I1
I2
3600000 milliseconds
(数学类比:间隔[10,12]和[95,97]是不同的时间间隔,但它们有相同的长度: “间隔长度”映射到持续时间)。
[10,12]
[95,97]
最后,期是“民用时间”的流逝,表示为月、日、小时等。它本身并不代表“物理”间隔,因此它不能直接转换为持续时间(月份有可变长度…)。
这回答了问题3:物理时间(持续时间)只能除以2。