Days between dates showing float value
我写了一个代码,用以下方式计算日期之间的天数
1 2 3 4 5 6 | SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = date.parse(startDate); Date date2 = date.parse(endDate); long difference = (date2.getTime()-date1.getTime())/(24*60*60*1000); |
我的工作是找出开始日期和结束日期之间的期限是否正好是一年。
在计算日期之间的差异后,我首先检查年份类型(是否为闰年/正常年份)。
如果不是闰年,那么我会检查差额是否为365
如果是闰年,我会检查差额是否是366。
但11月的几次约会
开始日期=11/04/2015(mm/dd/yyyy)结束日期=11/04/2016(mm/dd/yyyy)
差额按365计算,其中代码预计366作为结束日期,2016年是闰年,并且结束日期的月份在2月之后。
真正发生的是我们得到的绝对差异是365.9而不是366.0
根据我的观察,这只发生在11月的少数几天。
2015年2月11日至2016年2月11日、2015年3月11日至2016年3月11日、2015年4月11日至2016年4月11日、2015年5月11日至2016年5月11日、2015年6月11日至2016年6月11日。
剩下的,我看到的差异是366.0。
我的问题是,为什么我们只在这几次约会中看到这种特殊的行为。当date.gettime返回1970年1月1日00:00:00 GMT以来经过的毫秒数时,它有什么问题?
使用日期时间API。由于Java 8得到了这一点,你应该这样使用它:
1 2 3 4 5 6 7 8 9 | private static boolean isYearBetween(String start, String end) { DateTimeFormatter pattern = DateTimeFormatter.ofPattern("dd/MM/yyyy"); LocalDate startDate = LocalDate.parse(start, pattern); LocalDate endDate = LocalDate.parse(end, pattern); Period between = Period.between(startDate, endDate).normalized(); return Period.ofYears(1).equals(between.isNegative() ? between.negated() : between); } |
号
我运行你的代码,我得到了
1 2 3 4 5 | SimpleDateFormat date = new SimpleDateFormat("MM/dd/yyyy"); Date date1 = date.parse("11/02/2015"); Date date2 = date.parse("11/02/2016"); long difference = (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000); System.out.println("Difference" + difference); |
产量
江户十一〔一〕号
问题中的所有其他日期都一样。
对于非闰年,它按预期打印
为什么不使用Java 8的新特性:JavaTime.LoalDATeTIME?然后可以使用java.time.format.datetimeformatter轻松格式化日期和时间。在闰年,它的工作效果也比java.date好。
1 2 3 | LocalDate date = LocalDate.parse("yyyy-MM-dd"); LocalDate date1 = date.parse(startDate); LocalDate date2 = date.parse(endDate); |