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

时间点与当地时间:Instant 和 LocalDateTime 别混用

数据库里存了“上午九点”,却没存时区,跨地区展示时就无法确定它究竟对应哪个时间点。日志时间和日历预约有不同需求。

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

Java Full Course

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

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

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

问题从哪里出现

数据库里存了“上午九点”,却没存时区,跨地区展示时就无法确定它究竟对应哪个时间点。日志时间和日历预约有不同需求。

理解核心机制

Instant 表示时间线上的点,LocalDateTime 只包含本地日期与钟表时间。要把本地时间映射到时间点,还需要 ZoneId,并处理夏令时造成的重复或不存在时间。

动手做一个小实验

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

Java9 行 · 可横向滚动
import java.time.*;
public class Demo {
    public static void main(String[] args) {
        Instant event = Instant.parse("2026-01-01T00:00:00Z");
        System.out.println(event.atZone(ZoneId.of("Asia/Shanghai")));
        LocalDateTime appointment = LocalDateTime.of(2026, 1, 2, 9, 0);
        System.out.println(appointment.atZone(ZoneId.of("Asia/Shanghai")).toInstant());
    }
}

适用边界与常见误区

固定偏移量不等同于地区时区,地区规则可能变化。重复预约通常应保留当地时间和地区,事件记录则常适合保存明确的时间点。

继续练习

用存在夏令时的地区检查转换,比较“每隔 24 小时”和“每天本地上午九点”在时钟调整附近是否相同。

参考资料

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

← 返回文章归档