这是我的代码:
long treatmentTimeBeginDay;
if ( effectiveBegin.after(businessClosing) ) {
LOGGER.debug("Compute treatment time for beginDay = 0: the effective begin {} is after business closing {}",
config.formatLogDate(effectiveBegin),config.formatLogDate(businessClosing));
treatmentTimeBeginDay = 0;
} else {
LOGGER.debug("Compute treatment time for beginDay between {} and {}",config.formatLogDate(effectiveBegin),config.formatLogDate(businessClosing));
treatmentTimeBeginDay = businessClosing.getTime() - effectiveBegin.getTime();
}
Preconditions.checkState( treatmentTimeBeginDay >= 0 , "Internal bug! treatmentTimeBeginDay="+treatmentTimeBeginDay );
EffectiveBegin 和 businessClosing 不为空,也由 Guava 前置条件检查,您可以在日志中看到它...
它在大多数情况下运行良好,但在生产中我们有以下错误:
引起:java.lang.IllegalStateException:内部错误!治疗时间开始日=-852
我不会给你剩下的堆栈/代码,因为它应该足够了......我的 Guava checkState 调用显式引发了异常。
我也有日志:
DEBUG [BusinessHoursUtils.java:257] llairie - 计算 beginDay 的处理时间,介于 2012 年 7 月 19 日晚上 8:00 和 2012 年 7 月 19 日晚上 8:00 之间
(我现在不能用 Millies 记录)
我想了解的是。
如果我得到我给你的日志,这意味着测试if ( effectiveBegin.after(businessClosing) )
是错误的,所以 EffectiveBegin 应该在或者等于 businessClosing 之前。
在这种情况下,effectiveBegin 时间戳应低于 businessClosing 时间戳。
所以当我这样做时,businessClosing.getTime() - effectiveBegin.getTime();
我希望得到一个正数。
所以请有人告诉我为什么我的异常消息中有-852毫秒?这怎么可能?
编辑:我怀疑一个棘手的情况,即 after/before 方法在几毫秒内不起作用,这似乎是问题所在,因为我可以在本地重现它。
运行时的 2 个日期是:
businessClosing = {java.util.Date@503}"Thu Jul 19 20:00:00 CEST 2012"
fastTime = 1342720800000
cdate = null
effectiveBegin = {java.sql.Timestamp@498}"2012-07-19 20:00:00.999"
nanos = 999000000
fastTime = 1342720800000
cdate = {sun.util.calendar.Gregorian$Date@512}"2012-07-19T20:00:00.000+0200"
使用这些运行时对象,effectiveBegin.after(businessClosing) = false
如果我在 DB 中设置有效开始 = 2012-07-19 20:00:01.000,1 毫秒后,那么测试 = true
在这两种情况下,我都希望effectiveBegin.after(businessClosing) = true
似乎,就像 ametren 所怀疑的那样,我的日期不同。
那么,到底有什么问题呢?我们不应该能够以毫秒精度比较 2 日期实例吗?即使它们是 java.util.Date 的子类?