使用布尔类方法比较两个Date对象

时间:2019-01-10 18:51:48

标签: java date boolean equals

系统要求我使用布尔类方法比较2个Date对象的年,月和日。我到处搜索,无法获得有关如何执行此操作的更多信息,我一直在Date类而不是Boolean类中使用equals方法。这是我到目前为止的内容,但它给我一个错误消息。

public Boolean equals(Object obj) {        
    Date otherDate = (Date)obj;    
    return year == otherDate.year && month == otherDate.month && day otherDate.day;    
}

这是错误消息:

  

'Date'中的'equals(Object)'与'java.lang.Object'中的'equals(Object)'冲突;尝试使用不兼容的返回类型

3 个答案:

答案 0 :(得分:0)

也许我们可以尝试其他方法。

第一: compareDates方法通过构造Date来丢弃时间。

public class EqualityDates {

    public static void main(String[] args) throws ParseException {

        System.out.println(compareDates(10,0,2019).equals(compareDates(1,0,2019)));

    }

    private static Date compareDates(int day, int month, int year)  throws ParseException {
        MyDate myDate = new MyDate();

        DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        Calendar cal = Calendar.getInstance();

        cal.set(Calendar.DAY_OF_MONTH, day);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.YEAR, year);

        myDate.setMyDate(formatter.parse(formatter.format(cal.getTime())));

        return myDate.getMyDate();
    }

}

然后::类MyDate覆盖Equals和HashCode来比较日期。

class MyDate {

    Date myDate;

    public Date getMyDate() {
        return myDate;
    }

    public void setMyDate(Date myDate) {
        this.myDate = myDate;
    }

    @Override
    public boolean equals(Object obj) {

        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;

        MyDate otherDate = (MyDate) obj;

        if (myDate == null) {

            if (otherDate.myDate != null) return false;

        } else if (!myDate.equals(otherDate.myDate)) return false;

        return true;
    }

    @Override
    public int hashCode() {

        final int prime = 31;
        int result = 1;
        result = prime * result + ((myDate == null) ? 0 : myDate.hashCode());

        return result;
    }
}

这只是一个尝试!

答案 1 :(得分:0)

我不确定它的意义,但除非我被误解,否则它可以满足您的要求:

public class Date {

    private int year;
    private int month;
    private int day;

    // Constructor etc.

    @Override
    public boolean equals(Object obj) {        
        Date otherDate = (Date) obj;    
        return Boolean.logicalAnd(year == otherDate.year, 
                Boolean.logicalAnd(month == otherDate.month, day == otherDate.day));    
    }

    @Override
    public int hashCode() {
        return Objects.hash(year, month, day);
    }

}

我正在使用Boolean类方法(Boolean类中的静态方法)logicalAnd而不是&&。由于在调用方法之前先评估每个参数,因此不会像&&那样使评估短路。否则,它将给出相同的结果。由于您有三个子条件,并且该方法仅接受两个参数,因此我需要将一个调用嵌套为第一个调用中的一个参数。

如评论中所述,该方法需要返回原始boolean(小b)并应具有@Override批注。此外,在覆盖equals时,最好也覆盖hashCode并确保相等的对象具有相同的哈希码。

对于生产代码,可以使用内置的LocalDate而不编写自己的Date类。 LocalDate已覆盖equalshashCode,因此我们无需担心它们的实现方式。

答案 2 :(得分:-2)

两个日期对象始终可以使用其自己的equals方法进行比较,该方法以毫秒为单位使用getTime()进行比较。

date1.equals(date2);// returns boolean

您不能覆盖布尔类的equals方法,因为此类是最终的,因此不能扩展。