使用Java Instant类,如何舍入到最接近的秒?我不在乎是1毫秒,15毫秒还是999毫秒,所有数值都应该以0毫秒舍入到下一秒。

我基本上想要

Instant myInstant = ...

myInstant.truncatedTo(ChronoUnit.SECONDS);

但方向相反。

最佳答案

您可以通过使用.getNano来确保拐角处的时间不完全相等,以解决特殊情况,然后在有要截断的值时使用.plusSeconds()添加额外的第二个时间。

    Instant myInstant = Instant.now();
    if (myInstant.getNano() > 0) //Checks for any nanoseconds for the current second (this will almost always be true)
    {
        myInstant = myInstant.truncatedTo(ChronoUnit.SECONDS).plusSeconds(1);
    }
    /* else //Rare case where nanoseconds are exactly 0
    {
        myInstant = myInstant;
    } */

我留在else语句中只是为了演示如果恰好是0纳秒,则无需执行任何操作,因为没有理由截断任何内容。

编辑:如果要检查时间是否至少为1毫秒而不是1纳秒,则可以将其与1000000纳秒进行比较,而不是1纳秒,但是可以将else语句保留为截短纳秒的时间:
    Instant myInstant = Instant.now();
    if (myInstant.getNano() > 1000000) //Nano to milliseconds
    {
        myInstant = myInstant.truncatedTo(ChronoUnit.SECONDS).plusSeconds(1);
    }
    else
    {
        myInstant = myInstant.truncatedTo(ChronoUnit.SECONDS); //Must truncate the nanoseconds off since we are comparing to milliseconds now.
    }

10-06 02:10