0

私はdue_date=を持ってい2014-05-09 11:36:41.816ます。

今日の日付が と同じであるか、そうでない場合はユーザーがそのメッセージを表示する必要があるかどうかを確認したいdue_date1 day less then due_date思いrenewますtoo early to renew。私が更新しdate 8た場合、ユーザーは実行できますが、ユーザーが更新した場合date 7、彼は許可されず、メッセージが表示されます。

私は同じ日の手段をチェックすることを知っていますdate 9、私は使用することができます:

Timestamp t = new Timestamp(new Date().getTime());

if (t.compareTo(due_date)==0){
  //renew book
}

しかし、計算の1日前に行う方法がわかりません。そのためのガイダンスです。

4

3 に答える 3

2

適切な日時ライブラリ

古い java.util.Date および .Calendar クラスは厄介なことで知られているため、 Joda -Timeまたは Java 8 の新しいjava.timeを使用する必要があります。

タイムゾーン

タイムゾーンの問題を無視してはなりません。タイム ゾーンを省略すると、JVM (ホスト コンピューター) のデフォルトのタイム ゾーンが適用されます。結果は異なります。

「日」と「昨日」の定義は、特定のタイム ゾーンによって異なります。

適切なタイム ゾーン名を使用します(主に大陸スラッシュ都市)。3 文字または 4 文字のコードは標準化も一意でもないため、避けてください。

入力文字列にタイム ゾーン オフセットがない場合、つまりUTCである場合は、組み込みの定数を使用して指定しますDateTimeZone.UTC

間隔

Joda-Time は、期間を定義するためのIntervalクラスを提供します。あなたの場合、スパンは2日間で、期日とその前日です。(ちなみに、前の文で行ったように、問題に焦点を合わせて単純化することに一生懸命取り組むと、投稿された質問とプログラミングの両方が改善されます。)

半開き

通常、日時作業では、スパンを定義するために「ハーフオープン」アプローチを使用します。つまり、比較のために、最初は包括的であり、終わりは排他的であることを意味します。したがって、あなたの目的のために、 から まで実行したいと思いますfirst moment of the day before due dateが、は含みませんfirst moment of the day *after* due date

ISO8601

入力文字列はほぼISO 8601標準形式です。SPACE を に置き換えるだけTです。Joda-Time には、ISO 8601 形式用のパーサーが組み込まれています。

サンプルコード

Joda-Time 2.3 のコード例。

String inputDueDateRaw = "2014-05-09 11:36:41.816"
String inputDueDate = inputDueDateRaw.replace( " ", "T" );
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime due = new DateTime( inputDueDate, timeZone );  // Note the time zone by which to interpret the parsing of the string.
DateTime dayBeforeDue = due.withTimeAtStartOfDay().minusDays( 1 ).withTimeAtStartOfDay();
DateTime dayAfterDue = due.withTimeAtStartOfDay().plusDays( 1 ).withTimeAtStartOfDay(); // Half-open. Up to but not including day after.
Interval renewalInterval = new Interval( dayBeforeDue, dayAfterDue );

比較にハーフオープン アプローチを使用して、現在の瞬間がその間隔内にあるかどうかをテストします。

boolean isNowEligibleForRenewal = renewalInterval.contains( DateTime.now() );
于 2014-05-09T05:46:51.813 に答える