Java 显示浮动值的日期之间的天数

Java 显示浮动值的日期之间的天数,java,date,Java,Date,我已经编写了一个代码,以下面的方式计算日期之间的天数 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); 我的工作是确定开始日期和结束日期之间的期限

我已经编写了一个代码,以下面的方式计算日期之间的天数

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月的几次约会中

起始日期=2015年4月11日(年月日) 截止日期=2016年4月11日(年月日)

差异计算为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以来经过的毫秒,这有什么问题。

为什么不使用java 8:java.time.LocalDateTime附带的新功能?然后,您可以使用java.time.format.DateTimeFormatter轻松格式化日期和时间。对于闰年,它也比java.Date工作得更好

LocalDate date = LocalDate.parse("yyyy-MM-dd");
LocalDate date1 = date.parse(startDate);
LocalDate date2 = date.parse(endDate);

为什么不使用java 8附带的新功能:java.time.LocalDateTime?然后,您可以使用java.time.format.DateTimeFormatter轻松格式化日期和时间。对于闰年,它也比java.Date工作得更好

LocalDate date = LocalDate.parse("yyyy-MM-dd");
LocalDate date1 = date.parse(startDate);
LocalDate date2 = date.parse(endDate);

为什么不使用java 8附带的新功能:java.time.LocalDateTime?然后,您可以使用java.time.format.DateTimeFormatter轻松格式化日期和时间。对于闰年,它也比java.Date工作得更好

LocalDate date = LocalDate.parse("yyyy-MM-dd");
LocalDate date1 = date.parse(startDate);
LocalDate date2 = date.parse(endDate);

为什么不使用java 8附带的新功能:java.time.LocalDateTime?然后,您可以使用java.time.format.DateTimeFormatter轻松格式化日期和时间。对于闰年,它也比java.Date工作得更好

LocalDate date = LocalDate.parse("yyyy-MM-dd");
LocalDate date1 = date.parse(startDate);
LocalDate date2 = date.parse(endDate);

使用DateTime API。既然Java 8实现了这一点,您应该这样使用它:

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

使用DateTime API。既然Java 8实现了这一点,您应该这样使用它:

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

使用DateTime API。既然Java 8实现了这一点,您应该这样使用它:

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

使用DateTime API。既然Java 8实现了这一点,您应该这样使用它:

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

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

差异366

    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

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

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

差异366

    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

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

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

差异366

    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

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

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

差异366

    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

在分配给long之前,您可能需要使用Math.round()。或者利用乔达的时间。在分配给long之前,您可能需要使用Math.round()。或者利用乔达的时间。在分配给long之前,您可能需要使用Math.round()。或者利用乔达的时间。在分配给long之前,您可能需要使用Math.round()。或者利用乔达的时间。感谢您向我介绍java8日期时间API。但在这里,我的代码应该只通过Java6运行。我还想知道,为什么这种行为只发生在少数提到的日期。@user3173392我认为在Dates之间的周期。正如你所看到的,闰年有很多特殊情况。例如,如果结束日期在闰年中,即2月29日之后的日期,则使用366天或365天进行比较(与开始日期相同)。您应该考虑使用。谢谢您向我介绍Java8日期时间API。但在这里,我的代码应该只通过Java6运行。我还想知道,为什么这种行为只发生在少数提到的日期。@user3173392我认为在Dates之间的周期。正如你所看到的,闰年有很多特殊情况。例如,如果结束日期在闰年中,即2月29日之后的日期,则使用366天或365天进行比较(与开始日期相同)。您应该考虑使用。谢谢您向我介绍Java8日期时间API。但在这里,我的代码应该只通过Java6运行。我还想知道,为什么这种行为只发生在少数提到的日期。@user3173392我认为在Dates之间的周期。正如你所看到的,闰年有很多特殊情况。例如,如果结束日期在闰年中,即2月29日之后的日期,则使用366天或365天进行比较(与开始日期相同)。您应该考虑使用。谢谢您向我介绍Java8日期时间API。但在这里,我的代码应该只通过Java6运行。我还想知道,为什么这种行为只发生在少数提到的日期。@user3173392我认为在Dates之间的周期。正如你所看到的,闰年有很多特殊情况。例如,如果结束日期在闰年中,即2月29日之后的日期,则使用366天或365天进行比较(与开始日期相同)。您可以考虑使用。在更改数据格式之后,您可以尝试相同的简单日期格式到YYYY MM DDIAL输出吗?我不认为数据格式会改变。