在java.time.period类中,withDays(),withMonths(),withYears()的用途是什么?

2022-09-02 09:55:13

我注意到 java.time.Period 类包含一些实例方法,它们的行为与可用的静态工厂方法相同。

  • .withDays()行为与Period.ofDays()
  • .withMonths()行为与Period.ofMonths()
  • .withYears()行为与Period.ofYears()

这些实例方法令人困惑,因为它们会创建一个新的 Period 并返回它们,但没有考虑调用它们的 Period 的状态。

Period p = Period.ofWeeks(3);
p = p.withDays(2);

这似乎是合乎逻辑的,这将返回3周,2天的时间段,但它只返回2天的时间段。这与我调用 .Period.ofDays(2)

此外,还有其他五种没有类似实例方法的静态工厂方法。

那么,这三种实例方法存在是有原因的吗?如果是这样,用例是什么?


答案 1

你做了一个不幸的选择来测试,基本上 - “周”不是一个独立的单位;这只是7天的简写。从以下文档:ofWeeks

生成的时间段将基于天,天数等于周数乘以 7。年和月单位将为零。

然后调用 时,这实际上是“覆盖”结果中的天数,从 21 天增加到 2 天。withDays

因此,请尝试以下操作:

Period p = Period.ofMonths(3);
p = p.withDays(2);

现在将是3个月零2天。


答案 2

在java-8新的Date API中,它可能是一个规则,方法以意味着创建或新建对象开始,通常是静态方法,而方法以意味着修改某些属性开始,通常是对象方法。ofwith

so 表示创建一个时间段,其属性天数为 2,但表示将“期间”属性天数修改为新值 2。Period.ofDays(2)withDays(2)

他们有不同的角色。


推荐