如何将Long类型的当前时间毫秒数转换为指定格式的Date类型日期?
解决Long毫秒数转指定精度Date对象的问题
嘿,这里得先澄清一个关键点:Date类型本身是不携带任何格式信息的——它本质上就是个存储自1970年1月1日00:00:00以来毫秒数的对象。你看到的yyyy-MM-dd HH:mm这种格式,是把Date转换成String时才会有的展示形式。
所以你的需求核心应该是:把给定的Long型毫秒数,转换成一个精确到分钟级别的Date对象(也就是把秒和毫秒部分清零,对应到yyyy-MM-dd HH:mm:00.000这个时间点)。下面分两种主流场景给你实现方案:
方案一:Java 8及以上(推荐,API更简洁规范)
Java 8引入的新时间API(java.time包)处理这类需求更清晰,代码可读性更高:
import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.Date; public class MillisToDate { public static void main(String[] args) { // 示例:传入的Long型毫秒数(这里用当前时间演示) long inputMillis = System.currentTimeMillis(); // 1. 将毫秒数转为Instant,再绑定到系统默认时区 ZonedDateTime zonedDateTime = Instant.ofEpochMilli(inputMillis) .atZone(ZoneId.systemDefault()); // 2. 截断时间到分钟级别,自动清零秒和毫秒 ZonedDateTime minutePrecisionTime = zonedDateTime.truncatedTo(ChronoUnit.MINUTES); // 3. 转换为Date对象 Date targetDate = Date.from(minutePrecisionTime.toInstant()); // (可选)验证:将Date格式化为指定字符串查看结果 java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); System.out.println("对应格式的字符串:" + minutePrecisionTime.format(formatter)); System.out.println("最终的Date对象:" + targetDate); } }
代码说明:
truncatedTo(ChronoUnit.MINUTES)是核心操作,它会把时间的秒、毫秒部分直接清零,确保时间精确到分钟。- 如果需要指定时区(而非系统默认),可以把
ZoneId.systemDefault()替换成ZoneId.of("Asia/Shanghai")这类具体时区ID。
方案二:Java 7及以下(兼容旧版本)
如果你的项目还在使用Java 7或更早版本,可以用Calendar类来处理:
import java.util.Calendar; import java.util.Date; public class OldMillisToDate { public static void main(String[] args) { long inputMillis = System.currentTimeMillis(); Calendar calendar = Calendar.getInstance(); // 将毫秒数设置到Calendar中 calendar.setTimeInMillis(inputMillis); // 手动清零秒和毫秒,达到分钟精度 calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); // 转换为Date对象 Date targetDate = calendar.getTime(); // (可选)验证:用SimpleDateFormat格式化查看 java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm"); System.out.println("对应格式的字符串:" + sdf.format(targetDate)); System.out.println("最终的Date对象:" + targetDate); } }
代码说明:
- 通过手动设置
SECOND和MILLISECOND为0,实现时间到分钟的截断,得到的Date对象就对应你要的精度。 - 注意
SimpleDateFormat是非线程安全的,如果在多线程环境使用,建议每次创建新实例或者用ThreadLocal封装。
内容的提问来源于stack exchange,提问作者Euphoria
相关产品推荐
相关产品推荐

