首页 > 解决方案 > java.time.Period normalize() 更改月份字段的符号和值,尽管其绝对值小于 12

问题描述

用于normalize()读取的 Java se 8 API:

这将年和月单位标准化,而天数单位保持不变。月单位被调整为绝对值小于 11,年单位被调整以补偿。例如,“1 年 15 个月”的时间段将被标准化为“2 年 3 个月”。归一化后年月单位的符号相同。例如,“1 年零 -25 个月”的时间段将被规范化为“-1 年零 -1 个月”。

  public static void main(String[] args) {
    Consumer<Period> nlz = d -> System.out.println(d.normalized());
    nlz.accept(Period.of( 50, 10, -100));  // case 1
    nlz.accept(Period.of(-50, 10, -100));  // case 2
  }

/*
program output
--------------
P50Y10M-100D
P-49Y-2M-100D
*/

情况1:月单位的绝对值为10,保持不变。

案例2:月单位的绝对值为10,但改为-2。

标签: javajava-timeperiod

解决方案


我认为您误读了“标准化后年份和月份单位的符号将相同。”。这并不意味着年份和月份符号将保持不变,这意味着生成的年份符号将与生成的月份符号相同。

因此,在您的第二个示例中,必须将 10 个月调整为负数。这是一个模 12 运算,其结果为负且绝对值小于 12:10-12=-2。

然后调整年份值以保持相同的时期。


推荐阅读