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

SimpleDateFormat未解析毫秒致MySQL日期被舍入问题求助

嘿,我来帮你排查这个问题——你遇到的毫秒丢失和日期舍入问题,其实是两个常见的小坑,咱们一步步搞定:

解决SimpleDateFormat解析毫秒丢失与MySQL日期舍入问题

1. 先把SimpleDateFormat的格式字符串改对(最关键的第一步!)

你写的"yyyy-mm-dd HH:mm:ss.SSS"里藏着个致命小错误:小写的mm代表的是分钟,而不是月份!月份的正确占位符是大写的MM。虽然你的调试结果里月份看起来是对的,但这纯属巧合(字符串里的月份02刚好没和分钟部分冲突),但这个错误会导致解析逻辑混乱,直接影响毫秒部分的处理。

修正后的格式应该写成:

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

2. 别被Date的toString()输出骗了——它其实存了毫秒!

你调试时看到的Sun Feb 02 23:59:59 BRST 2018只是Date.toString()的输出,这个方法天生就不会显示毫秒部分,但这不代表Date对象里没存那700毫秒!你可以用getTime()方法验证,它会返回从1970年到该日期的总毫秒数,最后三位就是你要的700:

Date parsedDate = fmt.parse(myStringDate);
System.out.println(parsedDate.getTime()); // 输出类似1517621999700,末尾的700就是毫秒

3. MySQL字段类型不对,才会把毫秒舍掉!

如果你的表中日期字段用的是普通的DATETIME或TIMESTAMP,默认它们只精确到秒,插入时自动把毫秒砍掉,这就是你看到日期被舍入的原因。

要解决这个,得把字段改成支持小数秒的类型:

  • 要存毫秒(3位小数),用DATETIME(3)或者TIMESTAMP(3)
  • 如果需要更高精度(比如微秒),可以用DATETIME(6)或TIMESTAMP(6)

修改字段的SQL示例:

ALTER TABLE your_table MODIFY COLUMN your_date_column DATETIME(3);

4. 额外建议:换成Java 8+的新日期API,省心多了

SimpleDateFormat不仅线程不安全,还容易踩格式的坑,推荐用Java 8引入的java.time包,比如DateTimeFormatter和LocalDateTime,配合JDBC 4.2+可以直接和MySQL的小数秒字段交互,逻辑更清晰,也不容易出错:

String myStringDate = "2018-02-02 23:59:59.700";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime dateTime = LocalDateTime.parse(myStringDate, formatter);
// 存数据库时直接用setObject传入dateTime(需要你的JDBC驱动支持哦)
myPreparedStatement.setObject(1, dateTime);

内容的提问来源于stack exchange,提问作者Roland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:55:59