最推荐使用 java.time.instant 类获取gmt时间戳,因其原生表示utc时间、线程安全且精度高;instant.now() 获取当前utc时间点,toepochmilli() 转为毫秒级long值,parse() 或 ofepochmilli() 可反向构建。

Java中获取格林威治标准时间(GMT)时间戳,最推荐的方式是使用 java.time.Instant 类——它天然表示UTC时区的毫秒级时间点,无需手动处理时区转换,也避免了旧API(如 Date 或 Calendar)的线程安全与设计缺陷问题。
Instant 本质就是GMT/UTC时间戳
Instant 内部基于 Unix 纪元(1970-01-01T00:00:00Z),以纳秒精度存储自该时刻起经过的时间。它不包含时区信息,但其语义始终等价于 GMT(即 UTC)。因此,只要用 Instant 表示时间,就默认是格林威治标准时间。
- 调用
Instant.now()返回当前系统时钟对应的 UTC 时间点 - 打印
Instant默认格式为 ISO-8601(如2024-05-22T08:30:45.123Z),末尾的Z明确表示零时区(UTC) - 它不是“转换得到”的GMT,而是“原生就是”GMT
获取毫秒级时间戳(long 类型)
很多老系统或数据库字段仍使用 long 类型的毫秒时间戳(自1970-01-01T00:00:00Z起的毫秒数),Instant 提供了便捷方法:
-
instant.toEpochMilli():返回long毫秒值(最常用) -
instant.getEpochSecond():仅取秒级部分(丢弃毫秒) -
instant.toEpochMilli()是线程安全、不可变、零依赖的纯函数式操作
示例:
Instant now = Instant.now();
long timestampMs = now.toEpochMilli(); // 如:1716366645123
从字符串或毫秒值还原 Instant
若已有 GMT 格式的字符串或 long 时间戳,可反向构建 Instant:
- 从 ISO 字符串:
Instant.parse("2024-05-22T08:30:45.123Z") - 从毫秒值:
Instant.ofEpochMilli(1716366645123L) - 注意:字符串必须带
Z或明确时区偏移(如+00:00),否则会抛DateTimeParseException
不建议混用旧 API 转换
虽然可以写 new Date().toInstant() 或 Instant.ofEpochMilli(new Date().getTime()),但这属于兼容性过渡手段。直接使用 Instant.now() 更简洁、更可靠。尤其避免用 SimpleDateFormat 解析 GMT 字符串——它默认绑定本地时区,极易出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











