You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建不含毫秒的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:32:33