今、私はこのコードを使用しています
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を使用しました。事前にご協力いただきありがとうございます!
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日などの日付でも機能します。
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メソッドを使用する必要があります。
LocalDateTime
、 ZonedDateTime
、または OffsetDateTime
などのオブジェクトを使用している場合=、 LocalDate
に変換できます。
LocalDateTime.now().toLocalDate(); # 2015-11-24
私は、あなたが正気を保ちたいなら、 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
を返します。
受け入れられた答え は技術的には正しいですが、最適ではありません。 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ソリューションを参照してください。
カレンダーを設定する代わりに、これを試してください:
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値または任意の値と単純に比較できます。
Joda-Time の使用を検討することをお勧めします。これは、JDKの提供物よりも驚異的な方法です。
この方法を使用してこの方法をテストすると、少し混乱することがわかりました
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#プログラマーにとってカレンダーはとても奇妙でした:(
大体このようなもの:
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