如何解决带有负值的即时加号
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
逻辑,绝对无助于提高代码的可读性
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。