system.currenttimemillis()返回自1970-01-01 00:00:00 gmt起的毫秒数,需用simpledateformat等工具格式化为可读字符串或解析回毫秒值,注意线程安全、大小写敏感、时区及异常处理。

System.currentTimeMillis() 返回的是自 1970-01-01 00:00:00 GMT 起的毫秒数,它本身不是可读日期,必须借助格式化工具才能转成“年月日时分秒”这类直观形式。SimpleDateFormat 是最常用、最直接的转换方式,但要注意线程安全和精度细节。
毫秒值 → 可读日期字符串
这是最常见的需求:把 long 类型的时间戳变成带格式的字符串。核心步骤是创建 SimpleDateFormat 实例,用它 format 一个 Date 对象(由毫秒构造)。
- 先调用 new Date(milliseconds) 把毫秒转为 Date 对象
- 再用 SimpleDateFormat.format() 将 Date 转为指定格式的字符串
- 格式模式如 "yyyy-MM-dd HH:mm:ss" 表示“2026-06-11 12:42:30”,注意大小写敏感(比如 mm 是分钟,MM 是月份)
- 如果需要毫秒级精度,格式里加 ".SSS",例如 "yyyy-MM-dd HH:mm:ss.SSS"
字符串 → 毫秒值(反向解析)
当拿到类似 “2026-06-11 12:42:30” 的字符串,想还原成毫秒值,要用 SimpleDateFormat 的 parse 方法。
- 调用 parse(String) 得到 Date 对象,再用 .getTime() 获取毫秒值
- 务必用 try-catch 包裹,因为字符串格式不匹配会抛 ParseException
- 前后格式模式必须严格一致——用于 format 的模式,也得用于 parse,否则解析失败
- 默认不带时区,若字符串含时区(如 “CST”),格式中需对应写 "z" 或 "XXX"
避免常见坑点
SimpleDateFormat 不是线程安全的,多线程环境下直接复用同一个实例会导致格式错乱或解析异常。
- 推荐每次使用都新建实例,尤其在 Web 服务或并发场景下
- 或者用 ThreadLocal 封装,保证每个线程独享一个实例
- Java 8+ 更推荐用 DateTimeFormatter + LocalDateTime/Instant 替代,线程安全且更清晰
- 注意系统默认时区影响:SimpleDateFormat 默认使用本地时区,跨时区处理需显式 setTimeZone()
一个完整可用的小例子
下面代码能直接运行,输出当前时间的两种格式,并验证来回转换是否一致(注意加 .SSS 才能保毫秒精度):
- long now = System.currentTimeMillis();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
- String str = sdf.format(new Date(now));
- Date parsed = sdf.parse(str);
- System.out.println("原始毫秒:" + now + " → 格式化:" + str + " → 解析回毫秒:" + parsed.getTime());











