system.currenttimemillis() 返回的是自1970-01-01t00:00:00z起的utc毫秒数,本身即为utc时间戳,与本地时区无关;instant.now()语义更清晰,配合iso_instant可安全输出带z的utc字符串。

System.currentTimeMillis() 返回的是自 Unix 纪元(1970-01-01T00:00:00Z)以来的毫秒数,它**本身就是 UTC 时间的数值表示**,不依赖本地时区。
它返回的就是 UTC 时间戳
Java 的 System.currentTimeMillis() 底层调用操作系统高精度时钟,其参考基准是协调世界时(UTC),不是本地时间。也就是说:
- 这个 long 值代表的是“UTC 时间线上的第多少毫秒”,和你的系统时区设置无关;
- 你不需要做任何转换来“获取 UTC 时间戳”,它已经是 UTC 的毫秒值;
- 如果你用它构造
java.util.Date或Instant,得到的对象也默认对应 UTC 时刻(Date.toString()会按本地时区格式化显示,容易造成误解,但本质时间没变)。
安全地转成可读的 UTC 时间字符串
如果想以 UTC 时区格式化输出(比如 "2024-06-15T12:34:56.789Z"),推荐用现代 API:
- 用
Instant.now()—— 它内部就调用System.currentTimeMillis(),语义更清晰; - 用
DateTimeFormatter.ISO_INSTANT格式化,自动带 'Z' 表示 UTC:
String utcStr = instant.toString(); // 如 "2024-06-15T12:34:56.789012Z"
避免常见误解:不要用 Date.toString() 判断时区
new Date().toString() 输出类似 Sat Jun 15 20:34:56 CST 2024,这里的 CST 是你本地时区缩写,不代表这个 Date 对象本身是本地时间 —— 它仍是 UTC 时刻,只是打印时做了本地化。所以:
- 别靠
Date.toString()来确认是否 UTC; - 需要可靠 UTC 字符串,请用
Instant或显式指定ZoneOffset.UTC格式化。
需要 LocalDateTime 或 ZonedDateTime?明确指定时区
如果你要的是“UTC 时间对应的年月日时分秒”(即不带时区的本地视图),可用:
Instant.now().atZone(ZoneOffset.UTC).toLocalDateTime()- 或者更直接:
Instant.now().atOffset(ZoneOffset.UTC).toLocalDateTime()
注意:LocalDateTime 本身不含时区信息,它只是对 UTC 时刻的一种“切片”表达,不是“本地时间”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











