我试了很多东西,这个似乎是最有希望的,但仍然存在差异。
我有一个间隔(开始和结束日期总是在一个月内),我想知道这个月有多少天。此外,我想确保开始日期和结束日期在同一个月内。但由于日历返回的日期,这不起作用。这是我的代码和我的堆栈跟踪:
Calendar cstart = Calendar.getInstance();
cstart.setTime(startInterval);
Calendar cend = Calendar.getInstance();
cstart.setTime(endInterval);
int daysInMonth = cstart.getActualMaximum(Calendar.DAY_OF_MONTH);
if (cstart.get(Calendar.MONTH) != cend.get(Calendar.MONTH)) {
throw new FacadeException(AccountingFacadeMessages.BILLING_NOT_WITHIN_MONTH);
}
LOG.info("EndInterval " + endInterval.toString() );
LOG.info("StartInterval " + startInterval.toString() );
LOG.info(cstart.get(Calendar.DATE) + "." + cstart.get(Calendar.MONTH) + "." + cstart.get(Calendar.YEAR));
LOG.info("Days: " + daysInMonth + "\n");
堆栈跟踪:
2018-01-23 13:50:15,328: [INFO] EndInterval Sun Dec 31 00:00:00 CET 2017
2018-01-23 13:50:15,329: [INFO] StartInterval Fri Dec 01 00:00:00 CET 2017
2018-01-23 13:50:15,329: [INFO] 31.11.2017
2018-01-23 13:50:15,329: [INFO] Days: 31
当然有了这个,Exception会被抛出。对于堆栈跟踪,我将Exception放在注释中。
非常感谢:)
编辑:cstart.get(Calendar.MONTH) != cend.get(Calendar.MONTH)
会在月份不相同时抛出异常。我的开始日期是2017年1月12日,结束日期是2017年12月31日。所以月份应该是相同的,但不是,因为日历返回2017年11月31日而不是1月12日。所以异常会一直抛出。我真的需要正确的约会。
修改: 新的Stacktrace:
时间间隔:1.12.2017 - 2017年12月31日:
2018-01-23 14:38:28,005: [INFO] endInterval.toString(): Sun Dec 31 00:00:00 CET 2017
2018-01-23 14:38:28,005: [INFO] Calendar returns: 23.0.2018
2018-01-23 14:38:28,006: [INFO] startInterval.toString(): Fri Dec 01 00:00:00 CET 2017
2018-01-23 14:38:28,006: [INFO] Calendar returns: 31.11.2017
时间间隔:1.11.2017 - 2017年11月30日:
2018-01-23 14:38:52,398: [INFO] endInterval.toString(): Thu Nov 30 00:00:00 CET 2017
2018-01-23 14:38:52,399: [INFO] Calendar returns: 23.0.2018
2018-01-23 14:38:52,399: [INFO] startInterval.toString(): Wed Nov 01 00:00:00 CET 2017
2018-01-23 14:38:52,399: [INFO] Calendar returns: 30.10.2017
答案 0 :(得分:1)
你可能想要使用Java 8的新时间api,它不会像以前的jdk Date / Calendar api那样令人困惑。
final DateTimeFormatter sdf = DateTimeFormatter.ofPattern("dd/MM/yyyy");
final LocalDate end = LocalDate.of(2017, 12, 31);
final LocalDate start = LocalDate.of(2017, 12, 1);
System.out.println("end : " + sdf.format(end));
System.out.println("start : " + sdf.format(start));
if (end.getMonth() != start.getMonth()) {
throw new Exception("Month not equal");
}
答案 1 :(得分:0)
它按预期工作。这几个月是0。即1月是0月,12月是11月。
答案 2 :(得分:0)
您的问题不是Date
类,而是传递了错误的参数。
变化:
cstart.get(Calendar.DATE)
到
cstart.get(Calendar.DAY_OF_MONTH)
编辑:这不能解决问题。 似乎确实存在一些问题,但由于OP使用内部开发的Date / ..类,我不打算进一步追求。 对于那些想要了解更多相关信息的人,请查看评论。