关于java:显示浮点值的日期之间的天数

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);
}


我运行你的代码,我得到了366

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);

产量

江户十一〔一〕号

问题中的所有其他日期都一样。

对于非闰年,它按预期打印365


为什么不使用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);