Java 和 Period 中的 LocalDateTime class

LocalDateTime class in Java and Period

有这么简单Javaclass:

    public static void main(String[] args) {
      LocalDateTime dateTime = LocalDateTime.of(2017, 11, 26, 15, 38);
      Period period = Period.ofYears(1).ofMonths(2).ofDays(3);
      dateTime = dateTime.minus(period);
      System.out.println(dateTime);
    }
}

这导致 2017-11-23T15:38 谁能给我解释一下,为什么减去日期而年份和月份却没有?

很简单。

每个方法,ofYears、ofMonths 和 ofDays return period 的新实例。 所以实际上你的周期等于 Period.ofDays(3)

这不是构建器模式,您可以在其中不断修改同一个实例。

为了实现您的需要,此代码将完成以下工作:

    LocalDateTime dateTime = LocalDateTime.of(2017, 11, 26, 15, 38);
    Period period = Period.of(1, 2, 3);
    dateTime = dateTime.minus(period);
    System.out.println(dateTime);

打印出来

2016-09-23T15:38

因为它的工作方式类似于 Period.ofDays(3) 每次都被重写,因为它们是静态方法。

使用Period of(int years,int months,int days)

dateTime = dateTime.minus(Period.of(1, 2, 3));

或者您可以使用 withDayswithMonthswithYears 之类的链接

因为每三个方法

(ofYears(1) & ofMonths(2) & ofDays(3))

returns 的一个实例 class

每次调用另一个方法时 Period period 中的值都会被覆盖。

如果说 ofYears(1) return Period class 的实例命名为然后 ofMonths(2) 也是 return 一个新实例并覆盖他的初始实例。因此,最后一个保留并存储到 period 变量。

这就是为什么只有 ofDays(3) 显示效果。

如果你想做同样的事情,你应该尝试调用下面的方法

`public static Period of(int years,
                        int months,
                        int days) 

请记住 java.time 包中的所有 类 都是不可变的 (see Java Docs)Period 的实例创建后无法更改,您必须创建一个新实例并重新分配它。

这就是为什么只有最后一个 Period.ofDays(3) 对结果有影响的原因(正如前面的答案所暗示的)。这也是为什么 withDays returns 复制相应时期的原因。

Give a Man a Fish, and You Feed Him for a Day. Teach a Man To Fish, and You Feed Him for a Lifetime.

(这当然也适用于女性。)

我在教你钓鱼。我正在解释如何捕获此类错误,而不必先在 Stack Overflow 上询问。

设置 IDE 以在您使用对象(实例)调用静态方法时发出警告。那就是每当你做类似

的事情时
    yourObject.someStaticMethod();

在我的 Eclipse 中,您的代码给出了这个警告:

The static method ofDays(int) from the type Period should be accessed in a static way

这告诉我们ofDays()是一个静态方法,因此调用的结果与调用Period.ofDays(3)是一样的。 Eclipse 甚至愿意为我解决问题:

点击“Change access to static using Period (declaring type)”后,该代码行变为:

    Period.ofYears(1).ofMonths(2);
    Period period = Period.ofDays(3);

现在我想你可以明白为什么你得到了你得到的结果。

所以:

  1. 确保您的 IDE 配置为发出此类警告。不一定是Eclipse,其他IDE也可以。
  2. 当您收到这些警告时请阅读它们并确保您理解它们。如果您跳过一次警告,如果您得到意想不到的结果,请返回并再次阅读警告。如果您仍然需要在 Stack Overflow 上提问,当然欢迎您,并考虑包括您不理解的警告文本。

其他人很好地解释了如何修复您的代码以获得您想要的结果。如果 Period.of(1, 2, 3) 因为分不清年、月、周、日而有点混乱,使用 Period.ofYears(1).plusMonths(2).plusDays(3),一切都清楚了。它也类似于您在问题中尝试的内容。

Link: How to debug small programs 有很多提示类似于我在这里给出的提示(并不是因为你的问题很糟糕,这是一个很好的问题一个,我投了赞成票)。