当从 LocalTime 对象中减去给定的数量时,我意识到可能会发生上溢/下溢。
示例:
00:30 - 35 minutes = 23:55
23:30 + 35 minutes = 00:05
对于我的应用程序,我希望锁定时间使得上述内容在下溢时生成 00:00
,在溢出时生成 23:59
。
这可能吗?
最佳答案
我的建议是:
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);
上面假设 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));
}
关于java - 使用 Java LocalTime 锁定下溢/溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51808966/