根据Java API public boolean before(Date when)
当且仅当此日期所代表的时间瞬间时才为真 对象严格早于当时表示的瞬间;假 否则。
现在我必须检查用户输入的日期是否大于当前日期然后只接受输入,否则抛出异常,所以我在下面尝试
if(userInputDate.before(new Date())){
throw new Exception("Some Message");
}
但如果两个日期相同,那么它也会进入if
语句。这是否意味着它会计算时间然后检查而不是比较日期?如果是,如何解决我的问题?
任何人都可以告诉我如何添加检查吗?
答案 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;
}