【问题标题】:Instant plus with negative values带有负值的即时加号
【发布时间】:2021-05-14 03:57:33
【问题描述】:

我有这个代码

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。可读性很重要。然而,在这种特殊情况下,我会坚持使用 plus 并可能添加评论 // amountDays can also be negative 或者只是在您的 javadoc 中很好地记录它。投票结束,因为它是基于意见的。
  • 请注意 plus 的 javadoc,它说 “amountToAdd - 添加到结果中的单位数量,可能为负数” - 所以它是受支持的,也是预期的这个方法可以这样使用。
  • @Zabuzard,我问这个问题是因为我很好奇在执行时是否会发生错误,而不是 opinion-based
  • minus delegates to plus,所以应该没什么区别。
  • 这纯粹是“风格”,没有技术上的区别。鉴于“减号”只使用“加号”这一事实,请选择第二种简单的解决方案,它需要更少的代码。

标签: java java-time java.time.instant


【解决方案1】:

看看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 逻辑和绝对无助于提高代码的可读性

【讨论】:

    【解决方案2】:

    plus 带负值

    plus 方法支持从其documentation 中添加负时间以回到过去:

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

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


    实施

    琐事,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);
    

    【讨论】:

    • 当然,一旦您将值偏移了天,“现在”就不是一个好名称,除非您发明了一台时间机器并使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2010-11-12
    • 2015-10-31
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多