Java日期比较

时间:2016-06-02 08:03:04

标签: java

根据Java API public boolean before(Date when)

  

当且仅当此日期所代表的时间瞬间时才为真   对象严格早于当时表示的瞬间;假   否则。

现在我必须检查用户输入的日期是否大于当前日期然后只接受输入,否则抛出异常,所以我在下面尝试

if(userInputDate.before(new Date())){
      throw new Exception("Some Message");
     }

但如果两个日期相同,那么它也会进入if语句。这是否意味着它会计算时间然后检查而不是比较日期?如果是,如何解决我的问题?

任何人都可以告诉我如何添加检查吗?

2 个答案:

答案 0 :(得分:1)

班级before中的方法Date正在比较日期之间的毫秒数,因此它不是只比较当天,而是比较时间。

您可以创建一种方法来检查日期是否在同一天,第一个日期是否在第二天之前

public static boolean isBeforeDate(Date date1, Date date2) {       
    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
    boolean areTheSameDay = fmt.format(date1).equals(fmt.format(date2));
    return !areTheSameDay && date1.before(date2);
}

如果您可以在Java8中使用新的时间api而不是旧的Date类,则可以使用课程LocalDate和方法compareTo

boolean isBefore = myLocalDate.compareTo(myOtherLocalDate) < 0

答案 1 :(得分:0)

java.util.Date上允许将一天中的时间与一年中的某一天分开的所有方法都已弃用。因此,最好使用java.util.Calendar。此外,人们应该考虑每年通常有一个小时是在夏季结束的两天内。

有两种方法可以做到:

public static boolean isBeforeDay(Date date1, Date date2) {
    // convert date1 to noon on the same day
    Calendar day1 = Calendar.getInstance(TimeZone.getDefault());
    day1.setTime(date1);
    day1.set(Calendar.HOUR_OF_DAY, 12);
    day1.set(Calendar.MINUTE, 0);
    day1.set(Calendar.SECOND, 0);
    day1.set(Calendar.MILLISECOND, 0);

    // convert date2 to noon on the same day
    Calendar day2 = Calendar.getInstance(TimeZone.getDefault());
    day2.setTime(date2);
    day2.set(Calendar.HOUR_OF_DAY, 12);
    day2.set(Calendar.MINUTE, 0);
    day2.set(Calendar.SECOND, 0);
    day2.set(Calendar.MILLISECOND, 0);

    return day1.before(day2);
}


public static boolean isBeforeDay(Date date1, Date date2) {
    // get yyyymmdd value from date1
    Calendar day1 = Calendar.getInstance(TimeZone.getDefault());
    day1.setTime(date1);
    int ymd1 = 10000*day1.get(Calendar.YEAR) + 100*day1.get(Calendar.MONTH) + day1.get(Calendar.DAY_OF_MONTH);

    // get yyyymmdd value from date2
    Calendar day2 = Calendar.getInstance(TimeZone.getDefault());
    day2.setTime(date2);
    int ymd2 = 10000*day2.get(Calendar.YEAR) + 100*day2.get(Calendar.MONTH) + day2.get(Calendar.DAY_OF_MONTH);

    return ymd1 < ymd2;
}