问题描述
Instant Now = Instant.Now();
if (amountDays >= 0) {
Now = Now.plus(amountDays,ChronoUnit.DAYS);
} else {
Now = Now.minus(Math.abs(amountDays),ChronoUnit.DAYS);
}
我想把它简化成这样
Instant Now = Instant.Now();
Now = Now.plus(amountDays,ChronoUnit.DAYS);
但是,我不确定 plus
是否可以正确处理负值,或者是否会弄乱结果。
我可以像这样使用 plus
吗,可能是负值?
解决方法
plus
带有负值
plus
方法支持从其 documentation 中添加负时间以回到过去:
amountToAdd - 添加到结果中的单位数量,可能是负数
一切都很好,你可以像这样使用它,它会按预期工作。
实施
小知识,minus
的 current implementation 甚至以 plus
作为值委托给 -amountToSubtract
:
return (amountToSubtract == Long.MIN_VALUE
? plus(Long.MAX_VALUE,unit).plus(1,unit)
: plus(-amountToSubtract,unit));
注意事项
一般来说,如果您只想回到过去,最好使用 minus
以提高可读性。
在您的特定情况下,我会坚持只使用 plus
,但不会不必要地膨胀代码和逻辑。相反,更喜欢添加评论
// amountDays may be negative
或确保您的 javadoc 清楚这一点。
小改进,您可以将代码从两条语句简化为一条语句:
Instant now = Instant.now().plus(amountDays,ChronoUnit.DAYS);
,
看看minus
是如何实现的
@Override
public Instant minus(long amountToSubtract,TemporalUnit unit) {
return (amountToSubtract == Long.MIN_VALUE ? plus(Long.MAX_VALUE,unit) : plus(-amountToSubtract,unit));
}
当然,为了可读性起见,在适当的情况下同时使用 plus
和 minus
是有意义的,但检查 amountDays
是大于还是小于 0
似乎有些一种内部 Instant.plus
逻辑,绝对无助于提高代码的可读性