web-dev-qa-db-ja.com

日付オブジェクトが昨日と等しいかどうかを確認する方法は?

今、私はこのコードを使用しています

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE) - 1, 12, 0, 0); //Sets Calendar to "yeserday, 12am"
if(sdf.format(getDateFromLine(line)).equals(sdf.format(cal.getTime())))                         //getDateFromLine() returns a Date Object that is always at 12pm
{...CODE

GetdateFromLine()によって返される日付が昨日の日付であるかどうかを確認するためのよりスムーズな方法が必要です。時刻ではなく、日付のみが重要です。そのため、SimpleDateFormatを使用しました。事前にご協力いただきありがとうございます!

43
tzippy
Calendar c1 = Calendar.getInstance(); // today
c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday

Calendar c2 = Calendar.getInstance();
c2.setTime(getDateFromLine(line)); // your date

if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)
  && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) {

これは、1月1日などの日付でも機能します。

76

Java.time

Java 8に組み込まれたJava.timeフレームワークの使用

LocalDate now = LocalDate.now(); //2015-11-24
LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23

yesterday.equals(now); //false
yesterday.equals(yesterday); //true

オフィシャルOracle LocalDateチュートリアル 状態

比較にはequalsメソッドを使用する必要があります。

LocalDateTimeZonedDateTime 、または OffsetDateTime などのオブジェクトを使用している場合=、 LocalDate に変換できます。

LocalDateTime.now().toLocalDate(); # 2015-11-24
15
Przemek

私は、あなたが正気を保ちたいなら、 Joda-Time ライブラリが道であるという点で、アッシュ・キムに同意します。

_import org.joda.time.DateTime;

public static boolean dayIsYesterday(DateTime day) {
    DateTime yesterday = new DateTime().withTimeAtStartOfDay().minusDays(1);
    DateTime inputDay = day.withTimeAtStartOfDay();

    return inputDay.isEqual(yesterday);
}
_

この例では、DateTime dayが昨日の場合、dayIsYesterday(day)trueを返します。

14
plowman

Java.util.Dateおよび.Calendarを避ける

受け入れられた答え は技術的には正しいですが、最適ではありません。 Java.util.Dateおよび.Calendarクラスは厄介なことで有名です。それらを避けてください。 Joda-Time または新しい Java.timeパッケージ (in Java 8)のいずれかを使用します。

タイムゾーン

タイムゾーンは、日時の作業において重要です。問題を無視すると、JVMのデフォルトのタイムゾーンが適用されます。より良い方法は、デフォルトに依存するのではなく、常に指定することです。デフォルトを使用する場合でも、getDefaultを明示的に呼び出します。

1日の始まりはタイムゾーンによって定義されます。新しい日は、モントリオールよりもベルリンで早く始まります。そのため、「今日」と「昨日」の定義にはタイムゾーンが必要です。

ジョーダタイム

Joda-Time 2.3のサンプルコード。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" );
DateTime today = DateTime.now( timeZone ); 

昨日を決定する1つの方法は、LocalDateオブジェクトに変換することです。ここに示す別の方法は、「昨日」を期間として表すことです。この範囲は、昨日の最初の瞬間からただし含まない今日の最初の瞬間までと定義されます。このアプローチは「ハーフオープン」と呼ばれ、開始はclusiveで、終了はexclusive

昨日(または前日)に到達するために1日減算します。

DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval( yesterdayStartOfDay, today.withTimeAtStartOfDay() );

ターゲットのJava.util.DateオブジェクトをJoda-Time DateTimeオブジェクトに変換します。 JVMのデフォルトのタイムゾーンの適用に依存するのではなく、その新しいオブジェクトにタイムゾーンを適用します。技術的には、この場合のタイムゾーンは無関係ですが、タイムゾーンを含めることは良い習慣です。

DateTime target = new DateTime( myJUDate, timeZone );

ターゲットが昨日の間隔内に着陸するかどうかをテストします。

boolean isYesterday = yesterdayInterval.contains( target );

明らかに、半開期間のこのアプローチは、「今週」、「先月」などの「昨日」以上のもので機能します。

更新:Joda-Timeプロジェクトは現在メンテナンスモードになっています。チームは、Java.timeクラスへの移行を推奨しています。 Przemekによる正解 のJava.timeソリューションを参照してください。

8
Basil Bourque

カレンダーを設定する代わりに、これを試してください:

public static void main(String[] args) {
    int DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
    String prevDate = dateFormat.format(date.getTime() - DAY_IN_MILLIS);
    String currDate = dateFormat.format(date.getTime());
    String nextDate = dateFormat.format(date.getTime() + DAY_IN_MILLIS);
    System.out.println("Previous date: " + prevDate);
    System.out.println("Current date: " + currDate);
    System.out.println("Next date: " + nextDate);
  }

これにより、カレンダーに沿って前後に移動できるようになります。

次に、getDateFromLine(line)をprevDate値または任意の値と単純に比較できます。

2
gruntled

Joda-Time の使用を検討することをお勧めします。これは、JDKの提供物よりも驚異的な方法です。

1

この方法を使用してこの方法をテストすると、少し混乱することがわかりました

 Calendar now = new GregorianCalendar(2000, 1, 1);
 now.add(Calendar.DATE, -1);

 SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
 System.out.println(format.format(now.getTime()));

私の期待は印刷することです 1999-12-31、しかし実際は 2001-1-31 Calendar.add()は月の日のみを処理していると思います。

しかし、実際のエラーは、Calendarオブジェクトの作成方法です。カレンダーでは、月の始まり 、変数の現在の値は2001-2-1であり、それを印刷しないように私はとてもうぬぼれていました。カレンダーを作成する正しい方法は次のとおりです。

 Calendar now = new GregorianCalendar(2000, Calendar.JANUARY, 1);

元C#プログラマーにとってカレンダーはとても奇妙でした:(

0
Allen

大体このようなもの:

         Calendar c1 = Calendar.getInstance();
         Date d1 = new Date(/* control time */);
         c1.setTime(d1);

        //current date
        Calendar c2 = Calendar.getInstance();

        int day1=c1.get(Calendar.DAY_OF_YEAR);
        int day2=c2.get(Calendar.DAY_OF_YEAR);

       //day2==day1+1 
0
Inv3r53