system.currenttimemillis() 返回毫秒级时间戳(long型),表示自1970-01-01 00:00:00 utc起经过的毫秒数,本身无格式、非字符串;需借助simpledateformat(线程不安全)或datetimeformatter(推荐,线程安全)配合instant等类进行时区明确的格式化。

System.currentTimeMillis() 返回的是一个 毫秒级时间戳(long 类型),它本身**不包含任何格式信息**,也不做格式化——它只是从 1970-01-01 00:00:00 UTC(即 Unix 纪元)开始经过的毫秒数。
时间戳本身不是字符串,不能直接“格式化”
很多人误以为 System.currentTimeMillis() 会返回像 "2024-05-20 14:30:45" 这样的字符串,其实它只返回类似 1716215445123 的纯数字。要显示成可读时间,必须借助其他类进行转换。
常用格式化方式:用 SimpleDateFormat 或 DateTimeFormatter
Java 提供了两类主流方式将时间戳转为指定格式的字符串:
-
旧式(Java 7 及以前):SimpleDateFormat
线程不安全,需每次新建或加锁,仅作了解long ts = System.currentTimeMillis();<br> SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");<br> String formatted = sdf.format(new Date(ts)); -
推荐(Java 8+):DateTimeFormatter + Instant / LocalDateTime
线程安全、不可变、更清晰表达时区意图:long ts = System.currentTimeMillis();<br> Instant instant = Instant.ofEpochMilli(ts);<br> // 转为系统默认时区的本地时间并格式化<br> String formatted = instant.atZone(ZoneId.systemDefault())<br> .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
注意时区问题:时间戳是 UTC,显示依赖时区
时间戳本质是与时区无关的绝对时刻。但格式化成“年月日时分秒”时,必须明确指定时区,否则结果可能不符合预期:
- 用
Instant直接格式化会报错(没有时区信息) -
LocalDateTime.ofInstant(instant, ZoneId.systemDefault())是常见写法 - 若需固定时区(如北京时间),显式写
ZoneId.of("Asia/Shanghai")
快速获取标准 ISO 格式字符串(无需自定义)
如果只需要类似 "2024-05-20T14:30:45.123Z" 的标准格式,可直接用:
-
Instant.ofEpochMilli(ts).toString()→ 带 Z(UTC) -
Instant.ofEpochMilli(ts).atZone(ZoneId.systemDefault()).toString()→ 带本地时区偏移(如 +08:00)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











