Java Spring Boot从Oracle获取带AM的完整DateTime格式问题
问题原因与解决办法
原因分析
- JDBC驱动默认格式化:调用
rs.getString("TSTMP")时,Oracle JDBC驱动会将数据库的TIMESTAMP/DATE类型按默认规则转成字符串,并非你期望的26-DEC-23 10.00.00.000000 AM格式。 - LocalDateTime不存储格式信息:
LocalDateTime是Java的时间抽象对象,仅保存时间数值,不记录显示格式。直接打印它时,会触发默认toString()方法,输出yyyy-MM-dd HH:mm:ss风格的字符串,因此看不到AM标识和微秒。
解决办法
方法1:SQL层直接格式化输出
在查询语句中用Oracle的TO_CHAR函数指定时间格式,让查询结果直接返回目标格式的字符串:
SELECT TO_CHAR(TSTMP, 'DD-MON-RR HH.MI.SS.FF6 AM') FROM .... A
代码中直接获取该字符串,如需转时间对象再做解析:
String dbFormattedTime = rs.getString("TSTMP"); // 解析为LocalDateTime(按需操作) DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yy hh.mm.ss.SSSSSS a", Locale.ENGLISH); LocalDateTime dateTime = LocalDateTime.parse(dbFormattedTime, formatter); // 再次格式化输出(如果需要) String outputTime = dateTime.format(formatter);
方法2:获取时间对象后按需格式化
如果仅需在输出/展示时用指定格式,不要依赖LocalDateTime的默认输出,而是主动格式化:
// 直接从ResultSet获取时间对象(比getString再解析更可靠) LocalDateTime dateTime = rs.getObject("TSTMP", LocalDateTime.class); // 定义目标格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yy hh.mm.ss.SSSSSS a", Locale.ENGLISH); // 格式化后输出 String formattedTime = dateTime.format(formatter); log.info("dateStr: {}", formattedTime); // 若ReqBody需要存储格式化后的字符串,可将对应字段设为String类型 ReqBody e = ReqBody.builder() .tstmpStr(formattedTime) .build();
注意事项
- 若数据库字段为
TIMESTAMP WITH TIME ZONE,建议使用ZonedDateTime替代LocalDateTime,避免时区信息丢失。 - 优先使用
rs.getObject("TSTMP", LocalDateTime.class)获取时间对象,减少字符串解析带来的异常风险。
内容的提问来源于stack exchange,提问作者Rach
相关产品推荐
相关产品推荐

