Java 日期和时间:如何使 plus() 和 until() 互为反函数
Java Date and Time: How do I make plus() and until() to be each others inverse
大多数时候,这两种方法互为逆向:
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 plus 1 month: 2017-02-01
1-JAN until 1-FEB in months: 1 // GOOD
但是,在本示例中,从 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));
它们不是彼此相反:
31-JAN plus 1 month: 2017-02-28 // Bad? Should ceil to 1 March?
31-JAN until 28-FEB in months: 0 // Or is this bad? Should be 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
I probably want the plus to ceil instead of to floor
根据您的要求,您可能希望将所有月份视为理论上的 30 天。
大多数时候,这两种方法互为逆向:
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 plus 1 month: 2017-02-01
1-JAN until 1-FEB in months: 1 // GOOD
但是,在本示例中,从 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));
它们不是彼此相反:
31-JAN plus 1 month: 2017-02-28 // Bad? Should ceil to 1 March?
31-JAN until 28-FEB in months: 0 // Or is this bad? Should be 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
I probably want the plus to ceil instead of to floor
根据您的要求,您可能希望将所有月份视为理论上的 30 天。