在大多数情况下,这两种方法彼此相反:

  • 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月1日加上1个月:2017年1月1日
    1月1日至1月2日:1 //良好


    但是,在此示例中,从1月31日开始:
    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日2月:0 //还是不好?应该是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天。

    07-28 02:32