java - 爪哇。GregorianCalendar 月份的日期差异不正确
问题描述
爪哇 6.0
假设今天是: 2018 年 8 月 8 日
这里方法返回月份中 2 个日期的差异。
public static Integer getDiffMonths(Date dateFrom, Date dateTo) {
Calendar cal1 = new GregorianCalendar();
cal1.setTime(dateFrom);
Calendar cal2 = new GregorianCalendar();
cal2.setTime(dateTo);
return differenceInMonths(cal1, cal2);
}
private static Integer differenceInMonths(Calendar dateFrom, Calendar dateTo) {
int month1 = dateFrom.get(Calendar.YEAR) * 12 + dateFrom.get(Calendar.MONTH);
int month2 = dateTo.get(Calendar.YEAR) * 12 + dateTo.get(Calendar.MONTH);
int diff = month2 - month1;
return diff;
}
这里有4个测试用例的结果:
1.
currentDate = Aug 08 2018
DateTo = Aug 13 2018
diffMonth = 0
2.
currentDate = Aug 08 2018
DateTo = Oct 14 2018
diffMonth = 2
3.
currentDate = Aug 08 2018
DateTo = Jan 03 2019
diffMonth = 5
错误:差异必须是 4 个月
4.
currentDate = Aug 08 2018
DateTo = Aug 03 2019
diffMonth = 12
错误:差异必须是 11 个月
如您所见,测试用例 #1 和 #2 是正确的,但测试用例 #3 和 #4 是不正确的。
为什么?
解决方案
在计算差异时,您完全忽略了这一天。所以 1 月 1 日与 1 月 31 日相同。
前两个案例恰好在第二个日期有较大的一天,最后两个是较小的一天。但是这个信息被忽略了。
推荐阅读
- excel - VBA 代码错误 - 应用程序定义或对象定义错误
- java - AudioSystem 下载部分文件
- c# - 什么是 PowerShell.Telemetry.ApplicationInsightsTelemetry,我可以将其关闭吗?
- java - Robocode BasicBot 进入地图中间......不是
- javascript - 尝试将 drawImage() 与 webGL HTMLCanvasElement 一起使用会失败并擦除画布?
- kubernetes - 使用 GKE nginx 的 502 错误网关
- arrays - ruby 在多个数组上映射一个函数
- ruby-on-rails - PG::UndefinedTable:错误:关系“step_images”不存在
- r - 多曲面图的特定颜色
- javascript - Javascript检测具有清晰背景的图像上的碰撞