java中时间戳转日期字符串推荐用datetimeformatter(java 8+),线程安全;simpledateformat(java 7-)需注意非线程安全。时间戳为毫秒值,格式化结果取决于指定时区,如zoneid.systemdefault()或zoneid.of("utc")。

Java 中把时间戳(毫秒值)转成格式化日期字符串,核心是用 SimpleDateFormat 或更推荐的 DateTimeFormatter(Java 8+),配合 Date 或 Instant/LocalDateTime。
使用 SimpleDateFormat(适合 Java 7 及以下)
时间戳是 long 类型,代表从 1970-01-01 00:00:00 UTC 开始的毫秒数。先转为 Date,再用 SimpleDateFormat 格式化:
- 创建
SimpleDateFormat实例,指定目标格式,如"yyyy-MM-dd HH:mm:ss" - 调用
format(new Date(timestamp))得到字符串 - 注意:
SimpleDateFormat不是线程安全的,多线程中应避免复用同一实例
long timestamp = 1717023600000L;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(new Date(timestamp)); // 输出:2024-05-30 15:00:00
使用 DateTimeFormatter(推荐,Java 8+)
基于 java.time API,线程安全、不可变、语义清晰:
- 用
Instant.ofEpochMilli(timestamp)转为瞬时时间点 - 通过
atZone(ZoneId.systemDefault())绑定本地时区,得到ZonedDateTime - 用
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")格式化 - 也可直接用
LocalDateTime(忽略时区):先转Instant,再atZone(...).toLocalDateTime()
long timestamp = 1717023600000L;
Instant instant = Instant.ofEpochMilli(timestamp);
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
String dateStr = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(zdt);
处理不同时区(关键细节)
时间戳本身无时区,格式化结果取决于你用的时区:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
ZoneId.systemDefault()→ 按当前系统时区显示(如东八区显示为 CST) - 想固定为 UTC:用
ZoneId.of("UTC") - 想指定其他时区:如
ZoneId.of("Asia/Shanghai")或ZoneId.of("+08:00")
例如:同一时间戳在 UTC 和上海时区下,年月日时分可能不同(尤其跨日界时)。
常见格式符号速查
写 pattern 字符串时常用:
-
yyyy:4位年份;yy:2位年份 -
MM:两位月份(01–12);MMM:英文缩写(Jan);MMMM:全称(January) -
dd:当月第几天(01–31) -
HH:24小时制小时(00–23);hh:12小时制(01–12) -
mm:分钟(00–59);ss:秒(00–59) -
SSS:毫秒(000–999)
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










