如何创建不含毫秒的java.util.Date对象?解析后自动出现毫秒问题
问题解析与解决方案
首先得明确一个核心点:java.util.Date本质上就是个毫秒级时间戳——它从诞生起就精确到毫秒,不存在“有没有毫秒”的状态,只是你格式化的时候可以选择不把毫秒显示在字符串里而已。
咱们拆解下你的代码流程:
- 你创建的第一个
Date d是当前系统的精确时间,毫秒部分几乎肯定是非零的(除非刚好卡在整秒,那运气真的爆棚了)。 - 用
yyyy-MM-dd'T'HH:mm:ssXXX格式化时,因为格式里没写SSS(毫秒占位符),生成的字符串直接丢弃了原Date的毫秒信息,只保留到秒级。 - 解析这个字符串回Date对象时,
SimpleDateFormat找不到毫秒相关的数据,就会默认把新Date的毫秒部分设为0。你调试时看到的“出现了毫秒”,其实是这个新Date对象的毫秒字段被设为0了——原Date的毫秒已经丢失,解析后的是一个秒对齐的全新Date对象。
如果你想要的就是毫秒部分为0的Date对象,那你的代码其实已经实现了!可以试试打印dFromStr.getTime(),它的最后三位一定是0,这就代表毫秒为0,完全符合你的需求。
另外给个实用建议:SimpleDateFormat是非线程安全的,在Java 8及以后,更推荐使用java.time包的新日期API(比如OffsetDateTime),处理这类需求更清晰,还不会有线程安全隐患:
// 获取当前时间,直接截断掉毫秒部分 OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.SECONDS); // 格式化为你需要的字符串格式 String formattedStr = now.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME); // 解析字符串回日期对象 OffsetDateTime parsedDateTime = OffsetDateTime.parse(formattedStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME); // 如果需要兼容旧代码,转成java.util.Date Date targetDate = Date.from(parsedDateTime.toInstant());
这样操作逻辑更直观,也不容易踩坑~
内容的提问来源于stack exchange,提问作者drunkenfist
相关产品推荐
相关产品推荐

