【问题标题】:Comparing dates in Java比较Java中的日期
【发布时间】:2013-04-18 04:18:05
【问题描述】:

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

我有几个来自数据库的日期,它们是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。

请帮忙...

【问题讨论】:

  • Date 类怎么样?
  • "04/18/2013" 不是Date,而是String
  • 将字符串转换为 Date 对象,然后进行比较。
  • 您是按字母顺序比较字符串,不是按时间顺序比较日期。返回1compareTo 方法表示字符串按字母顺序依次排序。要按时间顺序进行比较,请将字符串转换为日期时间对象,使用 LocalDate 类。

标签: java string date compare compareto


【解决方案1】:

故障在于方法,

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;
}

【讨论】:

  • 非常感谢。我还有一个问题,数据库中的日期格式不一致。是否有一个 java 函数可以将所有格式转换为“MM/dd/yyyy”。这些是我拥有的其他格式:“MM/dd/yyyy”、“MM.dd.yyyy”、“MM-dd-yyyy”
  • 我猜你的数据库返回的是字符串而不是日期。所以这是一种数据不一致。现在要控制它,如果您可以更改表格,我想将其类型更改为 Date 或 DateTime 并移植数据。否则,在从数据库中提取数据时,将其转换为日期。否则请看我修改后的答案。
【解决方案2】:

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()));

【讨论】:

    【解决方案3】:

    这是我用过的最快的....

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

    【讨论】:

    • 仅供参考:Calendar 类是麻烦的旧日期时间类的一部分,现在已被 java.time 类取代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多