これが私のコードです:
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 は null ではなく、Guava の前提条件によってもチェックされており、ログで確認できます...
ほとんどの場合は正常に動作しますが、本番環境では次のエラーが発生します。
原因: java.lang.IllegalStateException: 内部バグ! 治療開始日=-852
十分なはずなので、残りのスタック/コードは提供しません...例外は、Guava checkState 呼び出しによって明示的に発生します。
ログもあります:
DEBUG [BusinessHoursUtils.java:257] llairie - 7/19/12 8:00 PM から 7/19/12 8:00 PM までの beginDay の処理時間を計算する
(今のところ、ミリ単位でログを取得できません)
私が理解しようとしているのは.
私があなたに与えたログを取得した場合、これはテスト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 effectiveBegin = 2012-07-19 20:00:01.000 に設定すると、1 ミリ秒後に test = true
どちらの場合も、私は期待するeffectiveBegin.after(businessClosing) = true
アメトレンが疑ったように、私の日付は違うようです.
では、結局何が問題なのですか?2 つの日付インスタンスをミリ秒の精度で比較できるはずではありませんか? java.util.Date のサブクラスであっても?