4

大多数情况下,这两种方法是互逆的:

  • Temporal Temporal.plus(long, TemporalUnit)
  • long Temporal.until(Temporal, TemporalUnit)

例如从 1 月 1 日开始:

System.out.println("1-JAN plus 1 month: " +
    LocalDate.of(2017, 1, 1).plus(1, ChronoUnit.MONTHS));
System.out.println("1-JAN until 1-FEB in months: " +
    LocalDate.of(2017, 1, 1).until(LocalDate.of(2017, 2, 1), ChronoUnit.MONTHS));

它们互为逆:

1-JAN 加 1 个月:2017-02-01
1-JAN 到 1-FEB 月份:1 // 好


但是,在此示例中,从 31-JAN 开始:

System.out.println("31-JAN plus 1 month: " +
    LocalDate.of(2017, 1, 31).plus(1, ChronoUnit.MONTHS));
System.out.println("31-JAN until 28-FEB in months: " +
    LocalDate.of(2017, 1, 31).until(LocalDate.of(2017, 2, 28), ChronoUnit.MONTHS));

它们不是彼此相反的:

1 月 31 日加 1 个月:2017-02-28 // 不好?上限应该到 3 月 1 日吗?
1 月 31 日至 2 月 28 日(以月计):0 // 或者这很糟糕?应该是1?


我怎样才能使它们彼此相反?

4

1 回答 1

1

这些日期之间只有 28 天,因此整月数为 0。但是,如果您希望不到 1 个月被视为一个月,则可以使用一些舍入。例如

// compare the months after rounding to the next month
LocalDate a = LocalDate.of(2017, 1, 31);
LocalDate b = LocalDate.of(2017, 2, 28);
long months = a.plus(1, ChronoUnit.MONTHS)
        .until(b.plus(1, ChronoUnit.MONTHS), ChronoUnit.MONTHS);
System.out.println(a + " until " + b + " in months: " + months);

印刷

2017-01-31 until 2017-02-28 in months: 1

// compare the months after rounding to the next month
LocalDate a = LocalDate.of(2017, 1, 31);
LocalDate b = LocalDate.of(2017, 3, 30);
long months = a.plus(1, ChronoUnit.MONTHS)
        .until(b.plus(1, ChronoUnit.MONTHS), ChronoUnit.MONTHS);
System.out.println(a + " until " + b + " in months: " + months);

印刷

2017-01-31 until 2017-03-30 in months: 2

我可能希望加到天花板而不是地板

根据您的要求,您可能希望将所有月份视为名义上的 30 天。

于 2016-04-13T08:52:37.220 回答