私は中級の Java コーダーで、ライブラリアン Java アプリを書いています。何らかの理由で、本が期限切れかどうかを判断するためにdueDate.after(today)
ORメソッドを使用する必要があるかどうかわかりません。dueDate.before(today)
両方のメソッドを入力することで、かなり矛盾した値が得られました。したがって、私のコードにも他のバグがあると想定しているので、他のバグの修正に進むことができるように、どちらが正しい方法であるかを確認していただければ幸いです。
5 に答える
必要なdueDate.before(today)
もの: 期日は今日より前です。期限が過ぎているため、書籍の期限が過ぎています。
オブジェクトを交換した方が簡単かもしれません。それを声に出して読むと、「もしtoday.after(dueDate)
今日が期日を過ぎていたら…」ということが突然明らかになります。
before
およびafter
メソッドは、 (または比較)ではなく、<
(または) 比較を実行することに注意してください。これが、API ドキュメントの「厳密に」という言葉の意味です。>
<=
>=
また、JavaDate
オブジェクトは、人々が通常「日付」と考えるものではなく、実際には瞬間です。つまり、日だけでなく時刻も比較します。
その日の時間を確認せずに、その日だけを比較したい場合は、すべての期日を特定の時間 (午前 0 時など) になるように作成します。たとえば、書籍の期限が 10 月 26 日であるとします。期限は 10 月 27 日の午前 0 時である可能性があります。
boolean overdue = !now.before(dueDate);
10 月 27 日の午前 0 時ちょうどの場合、このややぎこちない否定が説明されます。
dueDate.before(today)
は、書籍の実際の dueDate が今日より前に発生することに変換されます。つまり、実際には期限切れです。これはおそらくあなたが望むものです(trueをチェックしていると仮定します)
物事の反対側
dueDate.after(today)
これは、本の実際の dueDate が今日より後に発生することに変換されます。つまり、まだ期限が過ぎていないことを意味します。
との唯一の違いは!dueDate.after(today)
、dueDate.before(today)
両方の日付がまったく同じである場合の結果です。おそらく、本は期日に返却されたときに延滞していないため、dueDate.before(today)
正しいはずです。
特定されていないその他の問題についてjava.util.Date
は、カレンダーの日付ではなく、ミリ秒単位の精度の時点を表していることを知っていますか? つまり、カレンダー日付の比較メソッドを使用するには、Date インスタンスを作成するときに時間コンポーネントをゼロに設定する必要があります。問題のもう 1 つの原因は、タイム ゾーンの違いです。
それはあなたが何を達成したいかによります。dueDate は本の貸し出し時に設定したい日付ですか?返却期限は本の貸出日から導出されるのでbook.isDue(today)
、本のオブジェクトには貸出日と返却日が属性として含まれていると仮定するようなアプローチを試みます。
このような質問に対しては、オブジェクト間のアクションを設計する前に、どのオブジェクトが関与しており、それらの関係がどのようなものであるかを自分自身で明確にしておくと役立ちます。