比较存储在日期对象中的日期并返回布尔值

3

我在Java中比较日期时遇到了问题,我尝试过:

(today == actDate)

(today.equals(actDate))

这两个对象似乎始终都会被判断为false:

enter image description here

在上面的图片中,第一个日期是今天,第二个日期是actDate。

它们都是日期对象:

Date today = new Date(System.currentTimeMillis());

Date actDate = new Date(taskHours.get(j).getDate().getTime());

我尝试使用compareTo方法,但它似乎会返回1(日期较大)或-1(日期较小)。

我做错了什么?


1
日期似乎不同... - Sotirios Delimanolis
第一个有2013-05-03。 - David Tunnell
2
它们在毫秒级别上相等吗? - Sotirios Delimanolis
6个回答

3

java.util.Datejava.sql.Date有所不同。这可能是原因。


这似乎是原因。谢谢。比较字符串是否可行? - David Tunnell
@DavidTunnell 试一下吧。 - Juvanis
(!today.toString().equals(actDate.toString())) 运行正常,谢谢! - David Tunnell

2

处理日期有点棘手。由于JDBC使用java.sql.Timestamp,而在应用程序中通常使用java.util.Date,因此您需要使用compareTo。如果两个对象是两个不同类的实例(即使它们可能来自相同的层次结构),则通常不认为它们相等。

您想要做的是:

public boolean isSameDate(Date date1, Date date2) {
    return date1.compareTo(date2) == 0;
}

如果你想在null值出现时让生活更轻松,使用commons-lang
public boolean isSameDate(Date date1, Date date2) {
    return ObjectUtils.compare(date1, date2) == 0;
}

如果你只想比较日期信息(而不是时间),那么我建议你使用 Joda Time 库(特别是 LocalDate 类)。使用标准的 Java 组件将时间戳转换为日历日期对象并不是一项简单的任务(仅需一行代码)。


2

您的问题是 Date today = new Date(System.currentTimeMillis());。使用此代码,您将使用以毫秒为单位存储在日期对象中的当前系统时间。您的第二个日期不包含毫秒信息,这就是为什么每次比较都失败的原因。


你应该使用日历来清除日期中特定的不需要的组件,通常是向后舍入(通常是到前一天午夜或前一秒或前一分钟的整数)或设置相同的日期、月份和年份,以仅比较当天的小时。 - Lorenzo Gatti

1
使用日历对象代替。然后手动分别比较天、月和年。
Calendar cal1 = new Calendar();
cal1.setTime(date1);
Calendar cal2 = new Calendar();
cal2.setTime(date2);

boolean equal = true;
equal &= cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH);
equal &= cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);
equal &= cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR);

1

1
你正在比较两个不同的日期(可能秒数不同),因此equals方法返回false,这是预期的结果。使用equals是比较它们的正确方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接