2010-06-29 95 views
25

我需要比較java中的兩個日期。我正在使用這樣的代碼:在Java中比較兩個日期

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

我怎樣才能解決這個問題?

回答

41

日期平等取決於兩個日期等於毫秒。使用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(); 
} 
+0

您可能需要調整時區也是如此。 – 2010-06-29 20:24:48

+0

時區是使用喬達時間的另一個原因=) – 2010-06-29 20:26:29

+0

感謝Eric.It工作正常。我對此有一個問題。而不是寫作方法來消除時間,我們不能使用Dateformat?請澄清 – 2010-06-29 20:41:28

13

我會爲此使用JodaTime。這裏是一個例子 - 可以說你想找到2日期之間的差異。可以從here下載JodaTime。

+0

是的,我需要從startDate獲得1周前..感謝 – 2010-06-30 11:00:09

9

我不清楚你想要什麼,但我會提及Date類也有一個compareTo方法,如果兩個Date對象相等或(如果它們不相等相等),更快發生。這允許你做這樣的事情:

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-別人的,而不是任何生產代碼中的開關。此外,如果第二個日期爲空,您將得到NullPointerException,因此將代碼包裝在try-catch中可能會很有用。

-1

這裏就是你可以說YYYY-MM-DD比較做什麼:

GregorianCalendar gc= new GregorianCalendar(); 
gc.setTimeInMillis(System.currentTimeMillis()); 
gc.roll(GregorianCalendar.DAY_OF_MONTH, true); 

Date d1 = new Date(); 
Date d2 = gc.getTime(); 

SimpleDateFormat sf= new SimpleDateFormat("yyyy-MM-dd"); 

if(sf.format(d2).hashCode() < sf.format(d1).hashCode()) 
{ 
    System.out.println("date 2 is less than date 1"); 
} 
else 
{ 
    System.out.println("date 2 is equal or greater than date 1"); 
} 
1

下將返回true,如果兩個日曆變量有一年的同一天。

public boolean isSameDay(Calendar c1, Calendar c2){ 
    final int DAY=1000*60*60*24; 
    return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY)); 
    } // end isSameDay 
4

比較兩個日期的最簡單方法是將它們轉換爲數值(如unix timestamp)。

您可以使用Date.getTime()返回unix時間的方法。

Date questionDate = question.getStartDate(); 
Date today = new Date(); 
if((today.getTime() == questionDate.getTime())) { 
    System.out.println("Both are equals"); 
} 
+1

是的,但這基本上是'equals()'的作用。我也不認爲這回答了原來的問題。聽起來像他們試圖比較*日期*並忽略任何時間部分。使用'=='不會那樣做。 – Leigh 2012-12-13 05:57:46

+0

你說得對。我張貼另一個答案[鏈接](http://stackoverflow.com/questions/3144387/compare-two-dates-in-java/13870774#13870774) – Jamal 2012-12-14 00:11:35

+0

無需發佈另一個答案,只是[更新這一個](http ://stackoverflow.com/posts/13853528/edit)。 – Leigh 2012-12-14 00:15:11

0

這裏是另一個答案: 您需要格式化拖日期,以適應同一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"); 
    } 
+0

可能希望在發佈之前閱讀之前的建議[Krolique早在2010年建議](http://stackoverflow.com/a/4196253/104223);-)我個人更喜歡[Eric的建議](http:// stackoverflow的.com /一個/104223分之3144444)。字符串和日期邏輯不會混合使用IMO。 – Leigh 2012-12-14 00:25:53

3

它ESY使用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); 

    } 

} 
0
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); 
} 
0
public long compareDates(Date exp, Date today){ 

     long b = (exp.getTime()-86400000)/86400000; 
     long c = (today.getTime()-86400000)/86400000; 
     return b-c; 
    } 

這適用於GregorianDates. 86400000是在一天毫秒的量,這將返回兩個日期之間的天數。

0

雖然分享我的工作,但這是一篇很老的文章。這裏有一個小竅門這樣做

DateTime dtStart = new DateTime(Dateforcomparision); 
DateTime dtNow = new DateTime(); //current date 

if(dtStart.getMillis() <= dtNow.getMillis()) 
{ 
    //to do 
} 

使用比較按您的要求

在我的情況
0

,我必須做這樣的事情:

date1.toString().equals(date2.toString()) 

和它的工作!

2

java.time

在Java 8沒有必要使用Joda-Time因爲它與在java.time包類似的新的API。使用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可比使用equalscompareTo因爲它擁有沒有關於時間和時區信息。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了日期 - 時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

+1

很好的答案,但我建議始終將可選時區傳遞給'now'方法。如果省略,則隱含地取決於JVM當前的默認時區。即使在執行代碼(!)期間,該默認值可以隨時更改*。更好地指定預期/期望的時區。 'LocalDate.now(ZoneId.of(「America/Montreal」))' – 2016-09-18 21:19:40

0

它最....

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); 
+0

供參考:'Calendar'類是現在遺留下來的麻煩的舊日期時間類的一部分,由java.time類代替。 – 2017-04-19 18:50:35