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 は 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 のサブクラスであっても?

4

1 に答える 1

4

ここでの問題は、Timestamp と Date を混在させることです。Timestamp.after(Date)両方1342720800000の例にある日付コンポーネントのミリ秒のみを比較します。ただし、タイムスタンプ内に格納されて返されるTimestamp.getTime()ナノ秒 ( ) も考慮されます。結果として返されます。999000000ns = 999ms1342720800999businessClosing.getTime() - effectiveBegin.getTime()-999

この問題を解決するには、if ステートメントを に変更するか、if ステートメントの前に をif(effectiveBegin.compareTo(businessClosing) > 0)変換します。businessClosingDateTimestamp

于 2012-08-01T16:00:17.257 に答える