Java日历返回错误的日期

时间:2018-01-23 12:56:27

标签: java calendar

我试了很多东西,这个似乎是最有希望的,但仍然存在差异。

我有一个间隔(开始和结束日期总是在一个月内),我想知道这个月有多少天。此外,我想确保开始日期和结束日期在同一个月内。但由于日历返回的日期,这不起作用。这是我的代码和我的堆栈跟踪:

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

3 个答案:

答案 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 / ..类,我不打算进一步追求。 对于那些想要了解更多相关信息的人,请查看评论。