適切な日時ライブラリ
古い 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() );