使用Calendar比较Java 7中的日期

时间:2017-08-25 07:30:44

标签: calendar java-7 java-time date-comparison

我将治疗的开始日期与其结束进行比较,以检查治疗是否持续超过6个月。如果这个时期不包括二月,那么一切都很好,但是如果我比较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);
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

offset = new kafka.Offset(consumer.client); offset.commit(groupId, [{ topic: topic, partition: 0, offset: -1 }], function (err, data) { logger.debug("tried to set offset: ", data); if (err) logger.error("error", err); }) ); 构造函数(例如您正在使用的构建函数:Date)不仅已弃用(因此您应该避免使用它们),还要误导性,因为年份在1900年被索引(因此2017年变为3917)并且月份被零索引(值在零(1月)到11(12月)的范围内)。所以这并不像你想象的那样:

new Date(2017,1,1)

当您向Date start = new Date(2017, 1, 1); // February 1st 3917 Date end = new Date(2017, 6, 30); // July 30th 3917 添加6个月时,它会变为 8月1日 st ,这是start之后。

要创建1月1日 st 和6月30日 th ,您必须使用end并拥有2017年,您必须使用117(2017 - 1900):

month - 1

即使Date start = new Date(117, 0, 1); // January 1st 2017 Date end = new Date(117, 5, 30); // June 30th 2017 加上6个月 7月1日 st ,仍然在start之后(因此您的代码将抛出除外)。

旧类(endDateCalendar)有lots of problemsdesign issues,并且它们被新API取代

Java< = 7 中,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。

这个新API有lots of new date and time types来处理不同的情况。由于我们只处理日期(日/月/年),我们可以使用SimpleDateFormat

org.threeten.bp.LocalDate