Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Calendar 使用日历比较Java7中的日期_Calendar_Java 7_Java Time_Date Comparison - Fatal编程技术网

Calendar 使用日历比较Java7中的日期

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

我比较治疗的开始日期和结束日期,以检查是否持续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();
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
}