如何将Java Long类型时间戳转换为hh:mm:ss, dd/mm/yyyy格式
嘿,这个转换需求很常见,我给你两种Java里常用的解决方案,分别适配不同的JDK版本,你可以根据自己的项目情况选~
推荐方案:Java 8+ 新时间API(更安全可靠)
Java 8之后引入的java.time包解决了旧API的线程安全问题,用法也更清晰,是现在的首选方案。步骤很简单:
- 把Long类型的毫秒级时间戳转成
Instant对象 - 转换为指定时区的
LocalDateTime(如果不指定,默认用系统时区) - 用
DateTimeFormatter定义你需要的格式 - 格式化输出
注意:这里要特别注意格式字符串的大小写——MM代表月份,mm代表分钟;hh是12小时制(比如上午9点显示为09),如果需要24小时制就换成HH。
代码示例:
import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; public class TimestampConverter { public static void main(String[] args) { Long timestamp = 1527666638657L; // 转换为Instant(毫秒级时间戳对应ofEpochMilli) Instant instant = Instant.ofEpochMilli(timestamp); // 转成系统默认时区的LocalDateTime,也可以指定比如ZoneId.of("Asia/Shanghai") LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); // 定义格式化器,严格对应你要的'hh:mm:ss, dd/mm/yyyy'(注意把分钟的mm换成月份的MM) DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss, dd/MM/yyyy"); // 格式化得到结果 String formattedTime = localDateTime.format(formatter); System.out.println("Finishing-time = " + formattedTime); } }
兼容旧版本:使用SimpleDateFormat
如果你的项目还在使用Java 8之前的版本,那只能用SimpleDateFormat了,但要注意它不是线程安全的——不要把它声明为静态变量,要么每次使用都新建实例,要么用ThreadLocal来包装避免多线程问题。
代码示例:
import java.text.SimpleDateFormat; import java.util.Date; public class OldTimestampConverter { public static void main(String[] args) { Long timestamp = 1527666638657L; // 每次使用都新建SimpleDateFormat实例,避免线程安全问题 SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss, dd/MM/yyyy"); Date date = new Date(timestamp); String formattedTime = sdf.format(date); System.out.println("Finishing-time = " + formattedTime); } }
几个关键提醒
- 时区问题:如果你的业务需要统一时区(比如UTC或者北京时间),一定要明确指定,不然不同环境的系统默认时区可能会导致转换结果不一致。
- 格式字符串大小写:千万不要搞混
MM(月份)和mm(分钟),hh(12小时制)和HH(24小时制),这是很多人容易踩的坑。 - 线程安全:
SimpleDateFormat在多线程场景下会出问题,所以尽量用Java 8+的新API,或者做好线程隔离。
内容的提问来源于stack exchange,提问作者user9630935
相关产品推荐
相关产品推荐

