Javaで2つの日付を比較する必要があります。私はこのようなコードを使用しています:
Date questionDate = question.getStartDate();
Date today = new Date();
if(today.equals(questionDate)){
System.out.println("Both are equals");
}
これは機能していません。変数の内容は次のとおりです。
questionDate
には2010-06-30 00:31:40.0
が含まれますtoday
にはWed Jun 30 01:41:25 IST 2010
が含まれますどうすれば解決できますか?
日付の等価性は、2つの日付がミリ秒に等しいことに依存します。 new Date()
を使用して新しいDateオブジェクトを作成しても、過去に作成された日付と等しくなることはありません。 Joda Time のAPIは、日付の操作を簡素化します。ただし、JavaのSDKのみを使用する場合:
if (removeTime(questionDate).equals(removeTime(today))
...
public Date removeTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
これにはJodaTimeを使用します。次に例を示します。2つの日付の日数の差を見つけたいとします。
DateTime startDate = new DateTime(some_date);
DateTime endDate = new DateTime(); //current date
Days diff = Days.daysBetween(startDate, endDate);
System.out.println(diff.getDays());
JodaTimeは here からダウンロードできます。
あなたが何を望むのかは明確ではありませんが、 Date クラスには compareTo メソッドもあります。オブジェクトは等しいか(等しくない場合)、より早く発生します。これにより、次のようなことができます。
switch (today.compareTo(questionDate)) {
case -1: System.out.println("today is sooner than questionDate"); break;
case 0: System.out.println("today and questionDate are equal"); break;
case 1: System.out.println("today is later than questionDate"); break;
default: System.out.println("Invalid results from date comparison"); break;
}
APIドキュメントでは、結果が-1、0、1になることを保証していないことに注意してください。そのため、実動コードではスイッチではなくif-elsesを使用することができます。また、2番目の日付がnullの場合、NullPointerExceptionが発生するため、try-catchでコードをラップすると便利です。
2つの日付を比較する最も簡単な方法は、それらを数値(Unixタイムスタンプなど)に変換することです。
Unix時間を返すDate.getTime()
メソッドを使用できます。
Date questionDate = question.getStartDate();
Date today = new Date();
if((today.getTime() == questionDate.getTime())) {
System.out.println("Both are equals");
}
Java 8では、 Joda-Time を使用する必要はありません。 Java.time
パッケージ。 LocalDate
クラスを使用します。
LocalDate date = LocalDate.of(2014, 3, 18);
LocalDate today = LocalDate.now();
Boolean isToday = date.isEqual( today );
Period
クラスを使用して、日付間の期間を要求できます。
Period difference = Period.between(date, today);
LocalDate
は、 equals
と compareTo
を使用して比較できます。これは、時間とタイムゾーンに関する情報を保持しないためです。
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- Java.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
などの便利なクラスがあります。 、および more 。
time.compareTo(currentTime) < 0
を使用して簡単です
import Java.util.Calendar;
import Java.util.Date;
import Java.util.Timer;
import Java.util.TimerTask;
public class MyTimerTask {
static Timer singleTask = new Timer();
@SuppressWarnings("deprecation")
public static void main(String args[]) {
// set download schedule time
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 54);
calendar.set(Calendar.SECOND, 0);
Date time = (Date) calendar.getTime();
// get current time
Date currentTime = new Date();
// if current time> time schedule set for next day
if (time.compareTo(currentTime) < 0) {
time.setDate(time.getDate() + 1);
} else {
// do nothing
}
singleTask.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("timer task is runing");
}
}, time);
}
}
以下は、2つのカレンダー変数の年が同じ場合にtrueを返します。
public boolean isSameDay(Calendar c1, Calendar c2){
final int DAY=1000*60*60*24;
return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY));
} // end isSameDay
public long compareDates(Date exp, Date today){
long b = (exp.getTime()-86400000)/86400000;
long c = (today.getTime()-86400000)/86400000;
return b-c;
}
これはGregorianDates.
86400000は1日のミリ秒数であり、2つの日付間の日数を返します。
public static double periodOfTimeInMillis(Date date1, Date date2) {
return (date2.getTime() - date1.getTime());
}
public static double periodOfTimeInSec(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / 1000;
}
public static double periodOfTimeInMin(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / (60 * 1000);
}
public static double periodOfTimeInHours(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / (60 * 60 * 1000);
}
public static double periodOfTimeInDays(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000L);
}
それが最適です...
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);
私の場合、私はこのようなことをしなければなりませんでした:
date1.toString().equals(date2.toString())
そしてそれはうまくいきました!
ここに別の答えがあります:ストリングとして比較できるように、同じfromatに合うようにけん引日付をフォーマットする必要があります。
Date questionDate = question.getStartDate();
Date today = new Date();
SimpleDateFormat dateFormatter = new SimpleDateFormat ("yyyy/MM/dd");
String questionDateStr = dateFormatter.format(questionDate);
String todayStr = dateFormatter.format(today);
if(questionDateStr.equals(todayStr)) {
System.out.println("Both are equals");
}
これは非常に古い投稿ですが、私の作品を共有しています。これを行うための小さなトリックがあります
DateTime dtStart = new DateTime(Dateforcomparision);
DateTime dtNow = new DateTime(); //current date
if(dtStart.getMillis() <= dtNow.getMillis())
{
//to do
}
要件に応じてコンパレータを使用します