Java获取MySQL中timestamp类型字段的完整时间值(含秒)
解决MySQL Timestamp读取到Java Date丢失秒数的问题
以下是几种常见的排查和解决方法:
修正JDBC连接参数
这是最常见的原因:旧版JDBC驱动的日期处理逻辑会截断秒数。确保你的JDBC URL中包含useLegacyDatetimeCode=false参数,同时指定正确的时区,示例:jdbc:mysql://localhost:3306/your_db?useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false该参数会禁用过时的日期时间解析逻辑,保证完整读取timestamp的秒级精度。
检查结果集的读取方法
如果你坚持使用java.util.Date,必须用getTimestamp()方法读取字段,而不是getDate()(仅返回日期)或错误的格式化方式。读取后用带秒的格式输出:// 从结果集读取完整时间戳 Date loginTime = resultSet.getTimestamp("loginTime"); // 格式化时指定包含秒的模式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 与数据库时区保持一致 System.out.println(sdf.format(loginTime));注意:
java.util.Date本身是包含毫秒精度的,你看到的"2023-02-14 10:02"只是格式化输出时的格式问题,并非变量本身丢失了秒数。改用Java 8+的java.time API(推荐)
过时的Date/SimpleDateFormat类存在诸多设计缺陷,建议使用Java 8引入的java.time系列类,直接读取为LocalDateTime,精度更明确:// JDBC 4.2及以上版本支持直接读取LocalDateTime LocalDateTime loginTime = resultSet.getObject("loginTime", LocalDateTime.class); // 格式化输出完整时间 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); System.out.println(loginTime.format(formatter));确认数据库字段定义
虽然你提到字段是timestamp,但可以再确认下字段的实际精度:MySQL的timestamp默认精度是秒级,若字段定义为timestamp(0)也是正常的秒级精度;如果是timestamp后面带更小的精度(比如timestamp(2))也不影响秒的读取,这一步主要排除字段本身被截断的可能。
内容的提问来源于stack exchange,提问作者WCM
相关产品推荐
相关产品推荐

