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

Java Spring Boot从Oracle获取带AM的完整DateTime格式问题

问题原因与解决办法

原因分析

  1. JDBC驱动默认格式化:调用rs.getString("TSTMP")时,Oracle JDBC驱动会将数据库的TIMESTAMP/DATE类型按默认规则转成字符串,并非你期望的26-DEC-23 10.00.00.000000 AM格式。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:57:07