【问题标题】:Calculate days between dates without "extra" dates in leap years计算闰年没有“额外”日期的日期之间的天数
【发布时间】:2014-01-16 13:06:44
【问题描述】:

所以,我必须计算两个日期之间的天数,但不考虑闰年的额外天数......

因此,例如,在 2012 年 1 月 1 日到 2013 年 1 月 1 日之间,结果应该是 365 而不是 366。

我遇到了Joda-Time 的解决方案:

int days = Days.daysBetween(new DateTime(start), new DateTime(end)).getDays();

但我不能使用那个库...只有 Java API。

使用日历我运气不佳:

Calendar startCal=new GregorianCalendar();
Calendar endCal=new GregorianCalendar();
startCal.setTime(start);
endCal.setTime(end);
endCal.add(Calendar.YEAR,-startCal.get(Calendar.YEAR));
endCal.add(Calendar.MONTH,-startCal.get(Calendar.MONTH));
endCal.add(Calendar.DATE,-startCal.get(Calendar.DATE));

int daysDifference=endCal.get(Calendar.DAY_OF_YEAR);

任何不涉及大量代码的想法?

【问题讨论】:

  • 为什么要计算一个你知道是错误的值?
  • Days.daysBetween(new DateTime(start), new DateTime(end)).getDays(); 返回366,这是很好的结果:)
  • 计算 2 月 29 日在您的时间范围内出现的次数并减去它。
  • 因为我必须 :) 解释的时间太长,但它是我正在使用的应用程序的一部分......
  • @diminuta 解释为什么使用与您考虑的方法不同的方法通常会产生更好的解决方案。就个人而言,您想做的事情似乎是错误的。

标签: java date jodatime


【解决方案1】:

只需查看年份和日期即可。

 int days = (end.year-start.year)*365 + end.dayOfYear - start.dayOfYear;

【讨论】:

    【解决方案2】:

    你对这个说法有误:

    因此,例如,在 2012 年 1 月 1 日到 2013 年 1 月 1 日之间,结果应该是 365 而不是 366。

    JodaTime 在这种情况下返回 366,经过测试。

    没有 JodaTime 的解决方案

    GregorianCalendar start = new GregorianCalendar(2012, 0, 1);
    GregorianCalendar end = new GregorianCalendar(2013, 0, 1);
    int days = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * 365 +
            (end.get(Calendar.DAY_OF_YEAR) - start.get(Calendar.DAY_OF_YEAR));
    System.out.println(days);
    

    返回365

    【讨论】:

    • 好吧,我的 joda 时间肯定错了,但我不知道我是如何测试它的,它适用于一些包含闰年的日期,而不是......虽然你回答得晚了一点比stackoverflow.com/users/3049628/tim-b 我觉得你的回答更详细。
    • 是的,答案相同,但这个答案为您提供了实际代码。接受这个是公平的:D
    • @MariuszS 你的第一行让我很困惑:You are wrong with JodaTime code. (a) 我看不出原始海报的 Joda-Time 代码有什么问题。 (b) 一个快速的读者可能会解释为,正如您所说的 Joda-Time 代码是不正确的,而实际上它是正确的。也许你可以巧妙地回答。
    • 嗨,此解决方案因 startDate =26-02-2016 和 end date =03-03-2016 而中断。预期为 5,实际为 6。请提出解决方案。谢谢
    • @MariuszS:是的,实际天数是 6,但是当我们讨论从天数减法中跳过闰年时,我们预计输出为 5,但此页面上的答案将为我们提供 6而不是 5(这是预期的)。
    【解决方案3】:

    当结束日期是闰年并且在 2 月 29 日之后,其他答案不起作用。 在计算一年中的结束日期时,您需要排除 2 月 29 日。

    使用 Java 8 的 java.time 包,您可以在计算月初的年份时传入 isLeapYear 布尔值:

    LocalDate.now().getMonth().firstDayOfYear(false)
    

    然后可以将其组合到计算的其余部分中:

    LocalDate startDate = LocalDate.of(2011, 7, 1);
    LocalDate endDate = LocalDate.of(2012, 4, 9);
    
    int endDayOfYear = endDate.getMonth().firstDayOfYear(false) 
                             + endDate.getDayOfMonth() - 1;
    
    int daysNoLeaps = ((endDate.getYear() - startDate.getYear()) * 365) 
                             + endDayOfYear - startDate.getDayOfYear();
    

    【讨论】:

      【解决方案4】:

      谢谢Andy !!您的答案是正确的,但是当开始日期在闰年和 2 月 29 日之前它不起作用。为了解决这个问题,我添加了这个 ligne

      int startDayOfYear = startDate.getMonth().firstDayOfYear(false) + startDate.getDayOfMonth() - 1;

        LocalDate startDate = LocalDate.of(2011, 7, 1);
        LocalDate endDate = LocalDate.of(2012, 4, 9);
      
        int endDayOfYear = endDate.getMonth().firstDayOfYear(false) 
                           + endDate.getDayOfMonth() - 1;
      
        int startDayOfYear = startDate.getMonth().firstDayOfYear(false) 
                           + startDate.getDayOfMonth() - 1;`
      
        int daysNoLeaps = ((endDate.getYear() - startDate.getYear()) * 365) 
                           + endDayOfYear - startDayOfYear ; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        • 2021-07-08
        • 1970-01-01
        相关资源
        最近更新 更多