java - 使用 Java LocalTime 锁定下溢/溢出

标签 java date java-8 java-time localtime

当从 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/

相关文章:

java - final 字段如何防止其他线程看到部分构造的对象?

Java SimpleDateFormat 解析后时区错误

java - Java 8 的 parallelStream 中产生了多少线程?

java - Maven 构建后某些场景未加载

java - 如何在java 8中初始化二维数组

java - 如何使用java播放asx文件/流

java - 在 JOPTIONPANE 中禁用空格键和回车键

java - 如何获取二维数组(矩阵)的子数组

java - 2010 年 10 月 2 日的 Java 日历/日期错误?

date - SAS 按日期和时间合并