日期的布尔编码

时间:2018-05-21 05:21:50

标签: java

class Date {

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

    public Date() {
    }

    public Date(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;
    }

    public int getDay() {
        return this.day;
    }

    public int getMonth() {
        return this.month;
    }

    public int getYear() {
        return this.year;
    }

    public void setDay(int day) {
        day = enteredDay;
    }

    public void setMonth(int month) {
        month = enteredMonth;
    }

    public void setYear(int year) {
        year = enteredYear;
    }

    public String toString() {
        return getDay() + "/" + getMonth() + "/" + getYear();
    }

    public boolean isEarlier(Date) {
        if (enteredDay.getDay() < day) {
            return true;
        } else {
            return false;
        }
    }
}

我无法使用最后一种方法。它必须是布尔值,如果日期早于它,则返回true。我的问题(至少据我所知)正在弄清楚该怎么写&#39;&lt;&#39;运营商。任何有关其余代码的反馈将不胜感激。

3 个答案:

答案 0 :(得分:5)

我会过去一年,一个月和一天,然后依次对每一个进行比较,直到找到一对严格更早或更晚的对。

使用Comparator,尤其是Java 8的简洁语法,可以为您节省大量的样板代码:

public boolean isEarlier(Date other) {
    return Comparator.comparingInt(Date::getYear)
                     .thenComparingInt(Date::getMoth)
                     .thenComparingInt(Date::getDay)
                     .compare(this, other) < 0;
}

修改:
要回答评论中的问题,您当然可以手动比较每个字段:

public boolean isEarlier(Date other) {
    if (getYear() < other.getYear()) {
        return true;
    } else if (getYear() > other.getYear()) {
        return false;
    }

    // If we reached here, both dates' years are equal

    if (getMonth() < other.getMonth()) {
        return true;
    } else if (getMonth() > other.getMonth()) {
        return false;
    }

    // If we reached here, both dates' years and months are equal

    return getDay() < other.getDay();
}

这当然可以压缩到一个布尔语句,虽然它是否更优雅或更不优雅在旁观者的眼中(括号不是严格需要的,但恕我直言他们制作代码更清晰):

public boolean isEarlier(Date other) {
    return (getYear() < other.getYear()) ||
           (getYear() == other.getYear() && 
            getMonth() < other.getMonth()) ||
           (getYear() == other.getYear() && 
            getMonth() == other.getMonth() && 
            getDay() < other.getDay());
}

答案 1 :(得分:4)

如果您不想使用任何其他库,请尝试以下方法:

public boolean isEarlier(Date date) {
    if (this.getYear() < date.getYear()) {
        return true;
    } else if (getYear() == date.getYear()
            && this.getMonth() < date.getMonth()) {
        return true;
    } else if (getYear() == date.getYear()
            && this.getMonth() == date.getMonth()
            && this.getDay() < date.getDay()) {
        return true;
    }
    return false;
}

答案 2 :(得分:1)

您要求对您的代码提供反馈,所以这是

您的构造函数和设置方法决定了日期的值,您希望日期有效吗?

现在我可以这样做:

Date date = new Date(102, 17, -300); 

它会被认为是好的。

如果您想要允许无效日期,请至少添加一个isValid方法

public boolean isValid();