【发布时间】:2018-02-24 22:52:56
【问题描述】:
如何在JDK7中找到两个日期之间的差异,可以将差异加回使两个日期相等?
我尝试使用similar StackOverflow question 中的解决方案,从另一个日期中减去一个日期的毫秒数,但这可能会导致日期之间的差异不正确。
在本例中,我尝试通过设置a = (b-a) + a 使a 等于b
private void makeTwoDatesEqual(GregorianCalendar a, GregorianCalendar b, DatatypeFactory datatypeFactory) {
long b_minus_a = b.getTimeInMillis() - a.getTimeInMillis();
Duration delta = datatypeFactory.newDuration(b_minus_a);
delta.addTo(a);
}
但结果出乎意料:
之前
a = "2015-08-29T00:00:00.000Z"
b = "2040-01-01T00:00:00.000Z"
delta = "P24Y4M5DT0H0M0.000S" // 2 days longer than it should be.
之后
a = "2040-01-03T00:00:00.000Z"
b = "2040-01-01T00:00:00.000Z"
delta = "P24Y4M5DT0H0M0.000S"
a.equals(b) = false
Joda-Time 也有同样的问题:
private void makeTwoDatesEqual(GregorianCalendar a, GregorianCalendar b) {
DateTime date1 = new DateTime(a);
DateTime date2 = new DateTime(b);
Interval interval = new Interval(a.getTimeInMillis(), b.getTimeInMillis());
Period offsetPeriod = interval.toPeriod();
date1 = date1.plus(offsetPeriod);
date1.equals(date2); // false in my example
}
之前
date1 = "2015-08-29T00:00:00.000-05:00"
date2 = "2040-01-01T00:00:00.000-05:00"
offsetPeriod = "P24Y4M2DT23H"
date1.equals(date2) = false
之后
date1 = "2039-12-31T23:00:00.000-05:00"
date2 = "2040-01-01T00:00:00.000-05:00"
offsetPeriod = "P24Y4M2DT23H"
date1.equals(date2) = false
在询问之前,应该不需要考虑夏令时或闰年,因为在每个示例中,我都将间隔添加回与其派生的完全相同的时间段。
【问题讨论】:
-
由于数学原因,您想要的东西是不可能的。月份有不同的长度。因此,如果将一个月添加到 2017-01-28 或 2017-01-30 产生相同的结果 2017-02-28 那么返回的方式必然是矛盾的。
-
这就是 jodatime 间隔不起作用的原因。然而,持续时间至少应该可以计算为可以添加到任何日期的绝对时间。
-
是的,仅以秒或分钟等精确单位表示的持续时间(我在这里忽略闰秒)应该可以完成这项工作。但是您在示例中也使用了年和月(不精确的单位)。
Period类不适合您的要求。 -
没错,美诺。我将尝试使用 joda.time.Duration 而不是 Period。如果它有效,我会回答我的问题。感谢您的帮助。
-
“我尝试使用类似 StackOverflow 问题的解决方案,从另一个日期中减去一个日期的毫秒数,但这会导致日期之间的差异不正确。”能举个例子吗?
标签: java date datetime jodatime date-difference