2010-04-16 339 views
177

Joda-Time 2,什么是三种时间之间的差异跨越:Joda-Time:周期,时间间隔和持续时间有什么区别?

  • Period
  • Interval
  • Duration

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

    2. 哪一个表现更好?

    3. 为什么 Period or Duration或Interval instance not implemented?例如。需要p = p.divideBy(2);

+2

请注意,此日期时间术语尚未标准化(尚未)。 [ISO-8601](https://en.wikipedia.org/?title=ISO_8601)标准的[duration](https://en.wikipedia.org/?title=ISO_8601#Durations)是Joda - 时间考虑[[期间]](http://www.joda.org/joda-time/apidocs/org/joda/time/Period.html)。提出了将这些术语标准化的建议,但尚未完成。 – 2015-07-02 22:16:40

回答

225

3类,因为它们代表着不同的概念,所以它是选择一个合适的工作,而不是相对表现的问题。从documentation与我斜体添加评论:


在乔达时间的间隔代表的时间从一个毫秒瞬间到另一个瞬间的时间间隔。这两个时刻都是在日期时间连续体中完全指定的时刻,并且包含时区。 具体时间被定义为例如这可能是昨天20:00:00GMT和今天早上9:00:00GMT之间的时间间隔。

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

期间在约达时间表示一段时间中的字段来定义,例如,3年5个月2天和7小时。这与持续时间不同,因为它在毫秒方面不准确。只能通过指定与其相关的时刻(包括时间顺序和时区)才能将时间段解析为精确的毫秒数。 例如考虑一年的时间,如果我们在1月1日加上这个时间,我们将一直到明年1月1日,但时间长短取决于干预年份是否为闰年。同样,如果WE 1个月添加到本月1日起,然后我们会在接下来的一个月,但持续时间(毫秒)的第一个抵达基于有关


问题3月份会有所不同,划分持续时间的具体方法并不是真的需要,因为我们始终可以从持续时间中获取毫秒数long(使用getMillis()),将其分开并构建新的持续时间(使用new Duration(long duration))。

基于上述时间段的定义,划分句点并没有真正的意义。例如半个月是什么? (其长度取决于哪个月)。

+1

我认为划分一个时期确实有意义 - 半个月仍然是一个有效的时间单位,但它需要一个开始日期来确切地知道多久(以与一个月的有效期完全相同的方式)。 – hadley 2011-05-07 13:21:30

+8

Jodatime认为一段时间是INTEGER值域的元组,它不允许小数值。这与常见(民用)使用一致。实际上,平凡生活中没有人认为'1个月和10天'除以2是'半个月和5天'。如果你需要做这个部门,你可能想要去一个持续时间(物理时间)。 – leonbloy 2011-05-07 13:58:17

83

要添加到mikej's answer

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

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

甲约达时间间隔实际上是一对时刻(启动即时 - 结束时刻)。 即时又是一个“物理”概念,即时间轴上的一个点。例如(只是一个可能的符号):

(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]不同间隔,但它们具有相同的长度“间隔长度”映射到持续时间)。

最后,期间是“民事时间”的失效,表示为月,日,小时等的数量。它本身并不代表“物理”区间,因此它可以“ t直接转换为持续时间(月有可变长度...)。

这回答问题3:你只能分两个物理时间(持续时间)。

+0

四个月除以二将是两个月。为什么不是有效的? – hadley 2011-05-07 13:22:31

+0

你会如何计算'2个月; 18天除以3?你不能得到一个一致的定义,这种操作。 – leonbloy 2011-05-07 13:40:50

+3

我认为你可以得到一个一致的定义,但是你必须把它想成“2个月和18天”的1/3。除非将其转换为间隔,否则无法准确确定其内容。仅仅因为JODA不支持它并不意味着它是无效的。 – hadley 2011-05-07 16:19:30