2

我有这个代码

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,可能是负值吗?

4

2 回答 2

3

plus有负值

该方法支持从其文档plus中添加负时间以及时返回:

amountToAdd - 添加到结果中的单位数量,可能为负数

一切都很好,你可以这样使用它,它会按预期工作。


执行

小琐事,当前的实现甚至minus委托 to pluswith -amountToSubtractas 值:

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);
于 2021-02-10T13:05:56.950 回答
2

看看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逻辑,并且绝对不会帮助您的代码的可读性

于 2021-02-10T13:05:50.210 回答