Java LocalTime中的锁定下溢/上溢问题

4
当从一个LocalTime对象中减去一个给定的值时,我意识到可能会发生溢出/下溢。
例如:
00:30 - 35 minutes = 23:55
23:30 + 35 minutes = 00:05

对于我的应用程序,我想设置锁定时间,这样上述操作会在下溢时生成00:00,在上溢时生成23:59

这个有可能吗?


2
为什么不可能呢?试着写代码,如果你遇到具体问题,请向我们提问并附上你编写的代码。 - JB Nizet
可以给我们展示一个关于“溢出”的例子吗? - Youcef LAIDANI
@JBNizet 我会发布我正在使用的解决方案,但我只是好奇还有什么其他解决方案。 - Jordan Mackie
@Pshemo 是的,我的错。 - Jordan Mackie
2个回答

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);

假设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));
}

4
我会使用相同的思路,这是我对另一个操作的实现: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)); } - JB Nizet

0
在这个例子中,一个路由应该在开始之前锁定x的时间。
1 |LocalTime firstStopTime = firstStop.getStopTime(); 
2 |LocalTime earliestTime = firstStopTime.minus(beforeRouteLockTimeMins % 1440, ChronoUnit.MINUTES);
3 |LocalTime latestTime = firstStopTime.plus(afterRouteTimeLockMins % 1440, ChronoUnit.MINUTES);
4 |
5 |// Handle underflow/overflow when getting earliest/latest time
6 |if (earliestTime.isAfter(firstStopTime)) earliestTime = LocalTime.MIN;
7 |if (latestTime.isBefore(firstStopTime)) latestTime = LocalTime.MAX;

在第2行和第3行,我使用%来避免锁定时间大于24小时。无论溢出/下溢如何,它都不能超过原始时间,因此第6行和第7行的检查将起作用。
然后,我假设如果最早时间的减法实际上比停止时间还要晚,那么它必须已经下溢了,因此将其设置为00:00,而对于最新时间则相反。
最后,可以这样比较时间:
// Check route is within time constraint
if (currentTime.isBefore(earliestTime)) {
    return new RouteAvailabilityResponseModel(false, "Too early to begin route.");
} else if (currentTime.isAfter(latestTime)) {
    return new RouteAvailabilityResponseModel(false, "Too late to begin route.");
} else {
    return new RouteAvailabilityResponseModel(true, "Route can be started.");
}

虽然目前这个解决方案对我来说是有效的,但我想看看是否有其他不那么冗长的选项。(再说这是Java。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接