我需要比较两个日期(例如date1和date2),并提出一个布尔的同日,这是真的两个日期共享同一天,如果不是假的。

我该怎么做呢?这里似乎出现了一阵混乱。如果可能的话,我希望避免在JDK之外引入其他依赖项。

澄清:如果date1和date2拥有相同的年、月和日,则sameDay为真,否则为假。我知道这需要时区知识……它将很好地通过一个时区,但我可以生活与GMT或当地时间,只要我知道行为是什么。

再次澄清:

date1 = 2008 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
  => sameDate = true

date1 = 2009 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
  => sameDate = false

date1 = 2008 Aug 03 12:00:00
date2 = 2008 Jun 03 12:00:00
  => sameDate = false

当前回答

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
boolean sameDay = cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR) &&
                  cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR);

请注意,当涉及不同时区时,“同一天”并不是一个听起来那么简单的概念。上面的代码将针对这两个日期计算相对于运行它的计算机所使用的时区的日期。如果这不是您所需要的,那么您必须将相关的时区传递给Calendar.getInstance()调用,在您确定了“同一天”的确切含义之后。

是的,Joda Time的LocalDate将使整个事情更加清晰和简单(尽管涉及时区的同样困难也会存在)。

其他回答

对于Kotlin开发者来说,这是比较格式化字符串方法的版本:

val sdf = SimpleDateFormat("yyMMdd")
if (sdf.format(date1) == sdf.format(date2)) {
    // same day
}

这不是最好的方法,但它既短又有效。

更快的解决方案

像@AyeJay解决方案,但正确的所有时区,在时间戳中添加偏移量。

  public static boolean isSameDay(Date dateA, Date dateB) {
    int offset = TimeZone.getDefault().getRawOffset();
    try {
        long julianDayNumber1 = (dateA.getTime() + offset) / MILLIS_PER_DAY;
        long julianDayNumber2 = (dateB.getTime() + offset) / MILLIS_PER_DAY;
        return julianDayNumber1 == julianDayNumber2;
    } catch (Exception e) {
        return false;
    }
}

Java 8

如果你在你的项目中使用Java 8,并比较Java .sql。时间戳,你可以使用LocalDate类:

sameDate = date1.toLocalDateTime().toLocalDate().equals(date2.toLocalDateTime().toLocalDate());

如果您正在使用java.util。日期,看看伊斯特万的答案,它不那么含糊。

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
boolean sameDay = cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR) &&
                  cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR);

请注意,当涉及不同时区时,“同一天”并不是一个听起来那么简单的概念。上面的代码将针对这两个日期计算相对于运行它的计算机所使用的时区的日期。如果这不是您所需要的,那么您必须将相关的时区传递给Calendar.getInstance()调用,在您确定了“同一天”的确切含义之后。

是的,Joda Time的LocalDate将使整个事情更加清晰和简单(尽管涉及时区的同样困难也会存在)。

我使用“apache commons lang”包来做到这一点(即org.apache.commons.lang.time.DateUtils)

boolean samedate = DateUtils.isSameDay(date1, date2);  //Takes either Calendar or Date objects