java.time.Period,分割时间段会产生错误的结果。

3

我尝试使用 java.time.Period,结果与我的手动计算相差三天。 奇怪的是,当我将这段时间分成两个时期时,结果与我的手动计算相符。

第二种方法就像我手动计算时间段的方式。

我是否漏掉了什么?是否有一种标准的日历算法或方法?java.time.Period 使用的算法是什么?

import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;

public class test2 {

    public static void main(String[] args) {

        LocalDate d1 = LocalDate.of(2014, 2, 14);
        LocalDate d2 = LocalDate.of(2017, 8, 1);

        Period p = Period.between(d1, d2);

        //using period between the two dates directly
        System.out.println("period between " + d1.toString() + " and " + d2.toString() + " is " + p.getYears()
                + " years " + p.getMonths() + " months " + p.getDays() + " Days");

        //dividing the period into two parts 
        p = Period.between(LocalDate.of(2014, 3, 1), d2);

        System.out
                .println("period between " + d1.toString() + " and " + d2.toString() + " is " + p.getYears() + " years "
                        + p.getMonths() + " months " + d1.until(LocalDate.of(2014, 3, 1), ChronoUnit.DAYS) + " Days");

    }
}

1
你到底想做什么?你得到了什么结果?你期望得到什么结果? - Bernhard Barker
3个回答

4

在这里,您执行两个不同的操作:

Period p = Period.between(d1, d2)

给您提供了一种精美的格式化方式来输出这些日期之间的差异(您已经正确使用了格式选项)。

d1.until(d2, ChronoUnit.DAYS) 

将会给你相同的结果——但不太好看(基本上它只会给你两个LocalDates之间的天数)。


1

你应该期望的答案是:2014年2月14日至2017年8月1日之间的时间段为3年5个月18天。

  • 2014-02-142017-02-14是3年。
  • 2017-02-142017-07-14是5个月。
  • 2017-07-142017-08-01是18天。

计算从年到月再到日。这样可以计算出2014-02-14和2016-02-29之间的年数、月数和天数,得出2年15天。
如果首先计算天数,则难以确定2014-02-14和2016-02-29之间的年数、月数和天数,因为不存在2014-02-29这一天——在2014-02-14之后的14天是2014-02-28,在2014-02-14之后的15天是2014-03-01。

1
您在计算天数差异时,不能像您所做的那样分割时间段,因为周期计算取决于相关日期的月份/年份。在您的例子中,

2月14日 和 2014年3月1日之间的时间段只有15天,

而从 2月14日 到 2017年8月1日 的“天”时间段是从 2017年7月14日 到 2017年8月1日 计算的,这将是18天,具体如下:
1) 14/02/2014 -> 14/02/2017: 3 years
2) 14/02/2017 -> 14/07/2017: 5 months
3) 14/07/2017 -> 01/08/2017: 18 days

这意味着,如果你仅仅替换August 2017March 2014来计算天数差异,独立于整个日期,将会得到一个不准确的答案(15而正确答案应该是18天)。因此,如果你正在进行任何手动计算而不仅仅是它的day部分,你可能需要考虑整个日期,或者只需安全地使用methods提供的Period类执行所需的日期计算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接