Calendar 使用日历比较Java7中的日期
我比较治疗的开始日期和结束日期,以检查是否持续6个月以上。如果这段时间不包括2月份,一切都很好,但如果我将1月1日与6月30日进行比较,就会抛出我的例外。为了比较这两个期间,我将开始日期加上6个月,并将结果与结束日期进行比较,如下所示:Calendar 使用日历比较Java7中的日期,calendar,java-7,java-time,date-comparison,Calendar,Java 7,Java Time,Date Comparison,我比较治疗的开始日期和结束日期,以检查是否持续6个月以上。如果这段时间不包括2月份,一切都很好,但如果我将1月1日与6月30日进行比较,就会抛出我的例外。为了比较这两个期间,我将开始日期加上6个月,并将结果与结束日期进行比较,如下所示: Date start = new Date(2017,1,1); Date end = new Date(2017,6,30); Calendar startOfTreatment = new Calendar.getInstance(); startOfTr
Date start = new Date(2017,1,1);
Date end = new Date(2017,6,30);
Calendar startOfTreatment = new Calendar.getInstance();
startOfTreatment.setTime(start);
Calendar endOfTreatment = new Calendar.getInstance();
endOfTreatment.setTime(end);
startOfTreatment.add(Calendar.MONTH, 6);
if (startOfTreatment.compareTo(endOfTreatment) > 0) {
throw new InfinishedTreatmentException(startOfTreatment,endOfTreatment);
}
如何解决此问题?日期构造函数(如您正在使用的:
新日期(2017,1,1)
)不仅不推荐使用(因此您应该避免使用它们),而且误导性,因为年份索引为1900(因此2017年变为3917),月份索引为零(值在0(1月)到11(12月)的范围内)。因此,这与您所想的不同:
Date start = new Date(2017, 1, 1); // February 1st 3917
Date end = new Date(2017, 6, 30); // July 30th 3917
当您将6个月添加到开始
时,它将变为八月一日,在结束
之后
要创建1月1日和6月30日,您必须使用month-1
,要创建2017年,您必须使用117(2017-1900):
尽管如此,开始
加上6个月将是7月1日,它仍然在结束
之后(因此您的代码将抛出异常)
旧类(
Date
、Calendar
和SimpleDateFormat
)具有和,它们正在被新的API所取代
在Java中,可能值得发布更多的代码,例如StartTofTreatment是如何填充的?这是一个实际日期,有一年吗?我添加了我正在进行的测试,2月1日之后的六个月是8月1日,事实上,这比7月30日晚。这不是你所期望的吗?即使我使用7月1日相同的p进行测试也没有问题
Date start = new Date(117, 0, 1); // January 1st 2017
Date end = new Date(117, 5, 30); // June 30th 2017
LocalDate start = LocalDate.of(2017, 1, 1); // January 1st 2017
LocalDate end = LocalDate.of(2017, 6, 30); // June 30th 2017
// 6 months after start
LocalDate sixMonthsLater = start.plusMonths(6);
if (sixMonthsLater.isAfter(end)) {
// throw exception
}