Java 8 的 java.time API 通过 Instant、ZoneId 和 DateTimeFormatter 将毫秒级时间戳转为线程安全、不可变的可读字符串,推荐显式指定时区(如 Asia/Shanghai),避免依赖系统默认时区;纳秒级值(如 System.nanoTime())不可直接用作时间戳。

Java 8 引入的 java.time API 提供了清晰、线程安全、不可变的方式处理时间戳(即毫秒级或纳秒级的 long 值)并格式化为可读字符串。核心思路是:先将时间戳转为 Instant,再根据时区调整为 ZonedDateTime 或 LocalDateTime,最后用 DateTimeFormatter 格式化。
使用 Instant + ZoneId 转为带时区的可读时间
时间戳本质是自 1970-01-01T00:00:00Z(UTC)以来的毫秒数。推荐做法是明确指定时区,避免依赖系统默认时区:
- 用
Instant.ofEpochMilli(millis)将 long 时间戳转为 UTC 瞬间 - 通过
.atZone(ZoneId.of("Asia/Shanghai"))关联本地时区(如东八区) - 用预定义或自定义格式器输出,例如:
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").format(zonedDateTime)
快速格式化为本地时间(不显式指定时区)
如果只需按当前 JVM 默认时区显示,可简化为:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), ZoneId.systemDefault())- 再用
DateTimeFormatter格式化,例如:DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm").format(localDateTime) - 注意:此方式隐含依赖系统设置,生产环境建议显式传入
ZoneId
常用预定义格式器与自定义模式
DateTimeFormatter 提供多个静态常量,适合常见场景:
立即学习“Java免费学习笔记(深入)”;
-
DateTimeFormatter.ISO_LOCAL_DATE_TIME→ 2024-05-20T14:30:45 -
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)→ 依语言环境自动适配(如中文:2024年5月20日 下午2:30) - 自定义模式支持丰富符号:
"yyyy-MM-dd HH:mm:ss.SSS" → 2024-05-20 14:30:45.123
"dd/MM/yyyy HH:mm" → 20/05/2024 14:30
处理纳秒级时间戳(如 System.nanoTime() 不适用)
⚠️ 注意:System.nanoTime() 返回的是相对起始点的纳秒差值,**不能直接作为时间戳使用**。真正的时间戳应来自 System.currentTimeMillis() 或 Instant.now().toEpochMilli()。若你拿到的是秒级时间戳(10 位),需乘以 1000;若是微秒或纳秒级,需除以 1000 或 1_000_000 转为毫秒再处理。

















