即时加负值

Instant plus with negative values

我有这个代码

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 吗?

看看minus是如何实现的

@Override
public Instant minus(long amountToSubtract, TemporalUnit unit) {
    return (amountToSubtract == Long.MIN_VALUE ? plus(Long.MAX_VALUE, unit).plus(1, unit) : plus(-amountToSubtract, unit));
}

当然,为了可读性,在适当的情况下同时使用 plusminus 是有意义的,但是检查 amountDays 是否大于或小于 0 似乎是某种内部 Instant.plus 逻辑,并且 deifinitely 无助于提高代码的可读性

plus 具有负值

plus 方法支持添加负时间以返回过去,来自其 documentation:

amountToAdd - the amount of the unit to add to the result, may be negative

一切顺利,您可以像这样使用它,它会按预期工作。


实施

小知识,minuscurrent implementation甚至以-amountToSubtract为值委托给plus

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);