在java.time.Period类中,withDays(),withMonths(),withYears()的目的是什么

时间:2017-05-24 10:04:15

标签: java java-8 java-time

我注意到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)一样。

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

那么,这三种实例方法是否存在?如果是这样,用例是什么?

2 个答案:

答案 0 :(得分:28)

你做了一个不幸的选择,基本上 - "周"不是一个独立的单位;它只是7天的简写。来自ofWeeks的文档:

  

结果期间将基于日期,天数等于周数乘以7.年和月的单位将为零。

然后当您致电withDays时,有效地覆盖"覆盖"结果的天数,从21天到2天。

所以试试这个:

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

现在 3个月零2天。

答案 1 :(得分:0)

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

所以Period.ofDays(2)表示创建一个属性天数为2的期间,但withDays(2)表示将期间属性天数修改为新值2.

他们有不同的角色。