3

有这么一个简单的Java类:

    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 有人可以解释一下,为什么减去日期而年份和月份 - 没有?

4

5 回答 5

4

因为每三个方法

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

返回 Period 类的实例

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

如果说 ofYears(1) 返回名为 a 的 Period 类的实例,则ofMonths(2)还返回一个新实例并覆盖他的初始实例。因此,最后一个保留并存储到period变量中。

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

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

`public static Period of(int years,
                        int months,
                        int days) 
于 2020-07-12T10:15:44.937 回答
2

很简单。

ofYears、ofMonths 和 ofDays 方法中的每一个都返回一个新的 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
于 2020-07-12T10:07:35.457 回答
1

给一个人一条鱼,你就喂他一天。教一个人钓鱼,你养他一辈子。

(当然也适用于女性。)

我正在教你钓鱼。我正在解释如何在不必先询问 Stack Overflow 的情况下捕获这样的错误。

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

    yourObject.someStaticMethod();

在我的 Eclipse 中,您的代码给出了以下警告:

Period 类型的静态方法 ofDays(int) 应该以静态方式访问

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

在此处输入图像描述

在我单击“使用 Period(声明类型)更改对静态的访问”后,该代码行变为:

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

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

所以:

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

其他人很好地解释了如何修复您的代码以提供您想要的结果。IfPeriod.of(1, 2, 3)有点令人困惑,因为您无法分辨年,月,周和日,使用Period.ofYears(1).plusMonths(2).plusDays(3),一切都很清楚。它也类似于您在问题中尝试的内容。

链接: 如何使用与我在这里给出的许多技巧相似的技巧来调试小程序(并不是因为你的问题很糟糕,这是一个很好的问题,我赞成)。

于 2020-07-12T14:26:50.763 回答
1

因为它Period.ofDays(3)每次都像被覆盖一样工作,因为它们是静态方法。

使用期限(int years,int months,int days)

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

或者你可以使用withDays, withMonths,withYears比如链接

于 2020-07-12T10:12:15.800 回答
0

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

这就是为什么只有最后Period.ofDays(3)一个对结果有影响的原因(如先前的答案所示)。withDays这也是返回相应 Period 副本的原因。

于 2020-07-12T10:54:58.100 回答