2013-04-18 117 views
0

我已经阅读了日期函数,但我不能想出解决我的问题的最佳方法。在Java中比较日期

我有几个日期从数据库是String,我想比较它可能当前日期。我正在使用compareTo,但是使用这个函数有一个问题,我猜这是因为我在比较字符串。

这是我的函数:

public int dateCompare(String today, String date2){ 
    return today.compareTo(date2); 
} 

当我使用它在样本日期:

dateCompare("04/19/2013","04/18/2013"); 

则返回1,当我第一个参数的值更改为"04/20/2013"它仍然回报1.

请帮助......

+1

Date类怎么样? – 2013-04-18 04:19:02

+2

'“04/18/2013”​​'不是日期',它是'字符串' – MadProgrammer 2013-04-18 04:19:05

+0

将字符串转换为日期对象,然后进行比较。 – 2013-04-18 04:19:40

回答

0

Java有一个Date对象。你应该使用它。

import java.util.Calendar; 
import java.util.Date; 

public class CompareDates { 

    public static void main(String[] args) { 
     // Create a calendar, this will default to today 
     Calendar cal = Calendar.getInstance(); 
     // Subtract 1 day 
     cal.add(Calendar.DATE, -1); 
     // Compare the result (1) 
     System.out.println(dateCompare(new Date(), cal.getTime())); 
     // Add 2 days 
     cal.add(Calendar.DATE, 2); 
     // Compare the result (-1) 
     System.out.println(dateCompare(new Date(), cal.getTime()));    
    } 

    public static int dateCompare(Date today, Date date2) { 
     System.out.println("Compare " + today + " with " + date2); 
     return today.compareTo(date2); 
    } 
} 

你也可以只利用Date API和使用beforeafter ......

Date now = new Date(); 

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.DATE, -1); 
System.out.println(now + " isBefore " + cal.getTime() + " = " + now.before(cal.getTime())); 
System.out.println(now + " isAfter " + cal.getTime() + " = " + now.after(cal.getTime())); 
cal.add(Calendar.DATE, 2); 
System.out.println(now + " isBefore " + cal.getTime() + " = " + now.before(cal.getTime())); 
System.out.println(now + " isAfter " + cal.getTime() + " = " + now.after(cal.getTime())); 
5

故障是在方法,

public int dateCompare(String today, String date2){ 
    return today.compareTo(date2); 
} 

你正在考虑将此作为dateComparison,但查看方法参数String,String。

所以你实际上是比较两个字符串。

你应该首先被转换这些字符串日期...

一样,

public Date parseDate(String dateStr) { 
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 
    return df.parse (dateStr); 
} 

public int dateCompare(String today, String date2){ 
    return (parseDate(today)).compareTo(parseDate(date2)); 
} 

编辑:

修改为多种格式:

public Date parseDate(String dateStr, String parsingFormat) throws SomeParsingException { 
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 
    return df.parse (dateStr); 
} 

public Date parseDate (String dateStr) throws SomeException { 
    Date d1 = null; 
    try { 
     d1 = parseDate(dateStr, "MM/dd/yyyy"); 
    } catch (SomeParsingException ex) { 
     try { 
      d1 = parseDate(dateStr, "MM-dd-yyyy"); 

     } catch (SomeParsingException ex) { 
      try { 
       d1 = parseDate(dateStr, "MM.dd.yyyy"); 
      } catch(SomeParsingException ex) { 
       throw SomeException ("Unparseable date"); 
      } 
     } 
    } 
    return d1; 
} 
+0

非常感谢。 我还有一个问题,数据库的日期格式不一致。是否有Java功能将所有格式转换为“MM/dd/yyyy”。 这些是我的其他格式:“MM/dd/yyyy”,“MM.dd.yyyy”,“MM-dd-yyyy” – eurica 2013-04-18 04:43:05

+0

我猜你的数据库正在返回字符串而不是日期。所以这是一种数据不一致。现在要控制它,如果你可以改变表格,我猜想将它的类型改为Date或DateTime并移植数据。在从数据库中提取数据时,将其转换为日期。否则看看我的修改答案。 – 2013-04-18 04:48:20

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:53:26