使用Java LocalTime锁定下溢/溢出

Jor*_*kie 4 java date localtime java-8 java-time

当从LocalTime对象中减去给定量时,我意识到可能发生上溢/下溢.

例:

00:30 - 35 minutes = 23:55
23:30 + 35 minutes = 00:05
Run Code Online (Sandbox Code Playgroud)

对于我的应用程序,我想锁定时间,以便上面会00:00在下溢和23:59溢出时生成.

这可能吗?

Ole*_*.V. 6

我的建议是:

    LocalTime orig = LocalTime.of(0, 30);
    int minutesToSubtract = 35;
    long minutesSinceMidnight = ChronoUnit.MINUTES.between(LocalTime.MIN, orig);
    LocalTime result;
    if (minutesToSubtract > minutesSinceMidnight) {
        // Subtracting the minutes will pass midnight at start of day
        result = LocalTime.MIN;
    } else {
        // Normal case, no underflow
        result = orig.minusMinutes(minutesToSubtract);
    }
    System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

以上假设minutesToSubtract是非负面的.如果可能出现负数,则需要检查下溢和溢出.

检查溢出(超过23:59:59.999999999)的情况类似.使用LocalTime.MAX了一天的结束.

编辑: JB Nizet的评论中其他操作的代码值得正确的代码格式化,所以我在这里粘贴它:

public static LocalTime addWithoutOverflow(LocalTime baseTime, int minutes) {
    LocalTime maxTime = LocalTime.MAX;
    long maxNanos = ChronoUnit.NANOS.between(baseTime, maxTime);
    long nanos = Duration.ofMinutes(minutes).toNanos();
    return baseTime.plusNanos(Math.min(maxNanos, nanos));
}
Run Code Online (Sandbox Code Playgroud)

  • 我会用同样的想法.这是我对其他操作的实现:`public static LocalTime addWithoutOverflow(LocalTime baseTime,int minutes){LocalTime maxTime = LocalTime.MAX; long maxNanos = ChronoUnit.NANOS.between(baseTime,maxTime); long nanos = Duration.ofMinutes(minutes).toNanos(); return baseTime.plusNanos(Math.min(maxNanos,nanos)); }` (4认同)