WMX · 随记
·Java· 3 分钟阅读

Duration 与 Period:一天未必等于 24 小时

订阅有效期加一个月,和计时器等待固定秒数,不能使用同一种直觉。自然月长度不同,地区时钟也可能调整。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Full Course

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

订阅有效期加一个月,和计时器等待固定秒数,不能使用同一种直觉。自然月长度不同,地区时钟也可能调整。

理解核心机制

Duration 表示基于秒与纳秒的时间量,Period 表示年、月、日的日历量。先确定业务是在日历上前进,还是在时间线上经过固定时长,再选对应类型。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java9 行 · 可横向滚动
import java.time.*;
public class Demo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2026, 1, 31);
        System.out.println(date.plus(Period.ofMonths(1)));
        System.out.println(Duration.ofDays(1).toHours());
        System.out.println(Period.between(date, date.plusMonths(1)));
    }
}

适用边界与常见误区

月末对齐规则应和业务确认,尤其是按月续费。毫秒数也不适合直接充当用户看到的“几个月”。

继续练习

用一月三十一日与闰年二月构造样本,写出月末续订的预期结果,再用固定天数比较差别。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档