1

这是我的代码:

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 的子类?

4

1 回答 1

4

这里的问题是你混合了时间戳和日期。Timestamp.after(Date)仅比较日期组件的毫秒数,这两个组件都1342720800000在您的示例中。但是,Timestamp.getTime()也考虑999000000ns = 999ms存储在时间戳中并将返回的纳秒 () 1342720800999。所以businessClosing.getTime() - effectiveBegin.getTime()-999作为结果返回。

要解决此问题,您可以将 if 语句修改为,也可以在 if 语句之前if(effectiveBegin.compareTo(businessClosing) > 0)将其转换businessClosingDate为 a Timestamp

于 2012-08-01T16:00:17.257 回答