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));
或者您可以使用 withDays
、withMonths
、withYears
之类的链接
因为每三个方法
(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);
现在我想你可以明白为什么你得到了你得到的结果。
所以:
- 确保您的 IDE 配置为发出此类警告。不一定是Eclipse,其他IDE也可以。
- 当您收到这些警告时请阅读它们并确保您理解它们。如果您跳过一次警告,如果您得到意想不到的结果,请返回并再次阅读警告。如果您仍然需要在 Stack Overflow 上提问,当然欢迎您,并考虑包括您不理解的警告文本。
其他人很好地解释了如何修复您的代码以获得您想要的结果。如果 Period.of(1, 2, 3)
因为分不清年、月、周、日而有点混乱,使用 Period.ofYears(1).plusMonths(2).plusDays(3)
,一切都清楚了。它也类似于您在问题中尝试的内容。
Link: How to debug small programs 有很多提示类似于我在这里给出的提示(并不是因为你的问题很糟糕,这是一个很好的问题一个,我投了赞成票)。
有这么简单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));
或者您可以使用 withDays
、withMonths
、withYears
之类的链接
因为每三个方法
(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);
现在我想你可以明白为什么你得到了你得到的结果。
所以:
- 确保您的 IDE 配置为发出此类警告。不一定是Eclipse,其他IDE也可以。
- 当您收到这些警告时请阅读它们并确保您理解它们。如果您跳过一次警告,如果您得到意想不到的结果,请返回并再次阅读警告。如果您仍然需要在 Stack Overflow 上提问,当然欢迎您,并考虑包括您不理解的警告文本。
其他人很好地解释了如何修复您的代码以获得您想要的结果。如果 Period.of(1, 2, 3)
因为分不清年、月、周、日而有点混乱,使用 Period.ofYears(1).plusMonths(2).plusDays(3)
,一切都清楚了。它也类似于您在问题中尝试的内容。
Link: How to debug small programs 有很多提示类似于我在这里给出的提示(并不是因为你的问题很糟糕,这是一个很好的问题一个,我投了赞成票)。