用 long 类型存时间戳是工程实践中的合理选择——它解决精度、性能、跨系统一致性三类刚性问题,避免时区歧义,降低存储与计算开销,保障跨语言跨数据库兼容性,并便于并发安全与原子更新。

用 long 类型存时间戳,不是“可选”,而是工程实践中的合理选择——它解决的是精度、性能、跨系统一致性这三类刚性问题。
避免时区和语义歧义
LocalDateTime 或字符串格式(如 "2026-06-15 22:31")本身不携带时区信息。同一字符串在不同时区机器上解析出的绝对时刻可能不同;夏令时切换时还可能出现“重复一小时”或“跳过一小时”的歧义。而 long 表示的是自 Unix 纪元(1970-01-01 00:00:00 UTC)起的毫秒数,是唯一、无歧义的绝对时间点,天然适配分布式系统和跨时区协作。
降低存储与计算开销
- 一个 long 占 8 字节,无对象头、无字段引用,序列化/反序列化快,数据库索引效率高
- 对比 LocalDateTime:每次创建都要分配新对象,含年月日时分秒纳秒等多个字段,内存占用大,GC 压力明显
- 时间比较、加减、窗口计算等操作直接用数值运算,无需构造中间对象,CPU 指令级高效
保障跨语言与跨数据库兼容性
几乎所有主流系统都原生支持整型时间戳:
- MySQL 的 BIGINT、PostgreSQL 的 BIGINT、MongoDB 的 NumberLong
- 前端 JavaScript 的 Date.now()、Python 的 time.time() * 1000、Go 的 time.Now().UnixMilli()
- 消息队列(Kafka、RocketMQ)、时序数据库(InfluxDB、TDengine)均以 long 为时间基准
用字符串或日期类型存储,反而需要额外约定格式、处理时区转换、防范解析失败,增加集成成本。
便于并发安全与原子更新
在高频更新场景(如聚合统计、心跳上报),long 可配合原子操作实现无锁更新:
- 用
volatile long+ CAS 逻辑(如只保留最新时间戳) - 用
LongAccumulator实现线程安全的最大值聚合 - 而 LocalDateTime 是不可变对象,每次更新都需新建实例,再通过
AtomicReference替换引用,开销更高

















