【问题标题】:Joda-Time: what's the difference between Period, Interval and Duration?Joda-Time:Period、Interval 和 Duration 有什么区别?
【发布时间】:2011-02-08 20:40:00
【问题描述】:

Joda-Time2中,三种时间跨度有什么区别:

  • Period
  • Interval
  • Duration

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

    2. 哪个性能更好?

    3. 为什么划分周期或持续时间或间隔实例未实现?例如。 p = p.divideBy(2);

【问题讨论】:

  • 请注意,此日期时间术语尚未标准化(目前)。 ISO-8601 标准的 duration 概念是 Joda-Time 认为的 Period。已提出标准化此类术语的提案,但尚未完成。

标签: java jodatime


【解决方案1】:

需要 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))。

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

【讨论】:

  • 我认为划分一个时期确实有意义 - 半个月仍然是一个有效的时间单位,但它需要一个开始日期才能确切知道多长时间(就像一个月一样有效期)。
  • Jodatime 将句点视为整数值字段的元组,它不允许小数值。这与普通(民用)用途一致。在日常生活中几乎没有人认为“1 个月零 10 天”除以 2 是“半个月零 5 天”。如果你需要做那个划分,你可能想去一个持续时间(物理时间)。
【解决方案2】:

添加到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)

作为区间,I1I2不同,因为端点不同;但如果我将它们转换为持续时间,我会得到同样的结果:3600000 milliseconds

(数学类比:区间[10,12][95,97]是不同的intervals,但是它们有相同的length"interval length" em> 映射到 duration)。

最后,期间是“公民时间”的流逝,表示为月数、天数、小时数等。它本身并不代表“物理”间隔,因此它不能直接转换为 duration(月份的长度可变...)。

这回答了问题 3:您只能将物理时间(持续时间)除以 2。

【讨论】:

  • 四个月除以二就是两个月。为什么这无效?
  • 你将如何计算 '2 Months; 18 天除以 3?您无法对这种操作获得一致的定义。
  • 我觉得你可以得到一个一致的定义,但是你得把它想成是“2个月18天”时间的1/3。在将其转换为间隔之前,您将无法准确计算出它是什么。仅仅因为 JODA 不支持它并不意味着它是无效的。
  • @hadley “一天的三分之一”没有民间定义。例如。没有合同在一天的三分之一内有效。
  • @Richard Watson Days 可以是 23、24 或 25 小时,因为 DST。因此,“从...开始的一天的三分之一”是有效的,但只有“三分之一”是无效的。
猜你喜欢
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 2015-01-19
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多