2

特定の日付が特定の下限と上限内にあるかどうかを確認することになっているメソッドをまとめました。

時間は考慮せず、日付のみを考慮してください。非常に単純な作業のように見えましたが、デバッグ中に奇妙な動作が発生しました。

入力日付から時間値を削除するために、さまざまなアプローチを試しました。( .) しかし、それらはすべて、日付を前に置いて関数の結果を偽にするinDateという同じ予期しない動作を私に与えるようです。inLeftinLeft

スクリーンショットのデバッグ

スクリーンショットからわかるように、inLeftinLeftは等しい (時間を無視した場合) のに、なぜint leftLimit = DateTimeComparator.getDateOnlyInstance().compare(inLeft, inDate);0 ではなく 1 になるのでしょうか?

私の結論は、私は何か間違ったことをしているが、何が見つからないということです。これがまったく明白なことである場合は、ご容赦ください。

ここに私のコードがあります:

protected boolean checkDateInRange(Date inDate, Date inLeft, Date inRight) {
    System.out.println("inDate = " + inDate);
    System.out.println("inLeft = " + inLeft);
    System.out.println("inRight = " + inRight);

    int leftLimit = DateTimeComparator.getDateOnlyInstance().compare(inLeft, inDate);
    int rightLimit = DateTimeComparator.getDateOnlyInstance().compare(inDate, inRight);

    System.out.println("leftLimit = " + leftLimit);
    System.out.println("rightLimit = " + rightLimit);

    if (leftLimit > 0 || rightLimit > 0) {
        return false;
    }
    return true;
}

I/System.out: inDate = Mon Sep 26 00:00:00 GMT+02:00 2016
I/System.out: inLeft = Mon Sep 26 20:14:13 GMT+02:00 2016
I/System.out: inRight = Mon Sep 26 00:00:00 GMT+02:00 2016
I/System.out: leftLimit = 1
I/System.out: rightLimit = 0

問題は、0 ではなく leftLimit == 1 であり、inDate と時間のない inLeft が同じであることです。しかし、leftLimit の結果は 1 のままです。

編集(最終的な解決策):sumandas'とRobertsの解決策によると、期待される動作を実現する新しいメソッドを作成しました。

新しいコード:

protected boolean checkDateInRange(Date inDate, Date inLeft, Date inRight) {
    SimpleDateFormat simpleDateFormatter = new SimpleDateFormat("yyyy-MM-dd");
    String dateString = simpleDateFormatter.format(inDate);
    String leftString = simpleDateFormatter.format(inLeft);
    String rightString = simpleDateFormatter.format(inRight);

    if (leftString.compareTo(dateString) > 0 || dateString.compareTo(rightString) > 0)
        return false;

    return true;
}

なぜ私の最初の解決策がうまくいかないのか、私はまだ理解していません。

4

2 に答える 2

0

これを試して:

String date1 = "2014/09/12"
String date2 = "2016/09/12"
SimpleDateFormat simpleDateFormatter = new SimpleDateFormat("yyyy-MM-dd");

Date inDate = simpleDateFormatter.parse(date1);
Date inLeft = simpleDateFormatter.parse(date2);
Date rightDate = simpleDateFormatter.parse(date2);

以下のようにこれらを関数に渡し、比較を行います。

 protected boolean checkDateInRange(Date inDate, Date inLeft, Date inRight) {

    if (inDate.before(inLeft) || inDate.after(inRight)) {
      // Do something
    }
}

私の 2 セント、私は以前に Joda Time を使用してみましたが、あまりにも多くの場合、simpledateformat に切り替えましたが、joda time は ISO 日付形式で非常に役立ちます。

提案された解決策がうまくいかなかった理由:ドキュメント を読むと、LHS < RHS が -ve を返し、それ以外は +ve

あなたの例では、 getDateOnlyInstance は日付のみを返します

LHS = Sep 26 2016 = RHS and returns a 1. // Hope this helps.
于 2016-08-18T17:49:43.083 に答える