SQL格式'YYYY-MM-DD HH24:MI:SS.FF'转Java的日期格式化问题
Java实现与Oracle TO_CHAR等价的日期格式化
我来帮你解决这个问题,你的Java代码报错主要是因为SimpleDateFormat的格式符使用错误,而且它本身不支持微秒级的解析,咱们一步步来处理:
先分析你的问题根源
- 你用的
SimpleDateFormat格式字符串"yyyy-MMM-dd HH24:mm:ss.ff"有多处错误:MMM是月份缩写(比如Jan、Feb),但你的原始日期是数字月份,应该用MMHH24不是Java的格式符,24小时制的小时应该用HHff在Java里代表毫秒(最多三位),但你的原始数据是微秒(六位),SimpleDateFormat不支持微秒解析
- 原始日期字符串
2018-4-24.8.1. 30. 404577000的格式是年-月-日.时.分. 秒. 微秒000,和你写的格式完全不匹配,这也是解析报错的核心原因
推荐解决方案(Java 8+ 优先使用)
Java 8引入的DateTimeFormatter是线程安全的,而且支持微秒级的时间处理,完全能匹配Oracle的TO_CHAR(crtd_ts,'YYYY-MM-DD HH24:MI:SS.FF')效果,代码如下:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.util.Locale; private String formatDate(String refCrtdTs) { // 定义解析原始字符串的格式,匹配"2018-4-24.8.1. 30. 404577000"的结构 DateTimeFormatter parser = new DateTimeFormatterBuilder() .appendPattern("yyyy-M-dd.H.m. ss. ") // 解析6位微秒 .appendValue(java.time.temporal.ChronoField.MICRO_OF_SECOND, 6) // 忽略末尾的3个0(纳秒部分) .appendLiteral("000") .toFormatter(Locale.ENGLISH); // 把原始字符串解析为LocalDateTime LocalDateTime dateTime = LocalDateTime.parse(refCrtdTs, parser); // 定义目标格式,对应Oracle的YYYY-MM-DD HH24:MI:SS.FF DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"); return formatter.format(dateTime); }
代码说明
- 用
DateTimeFormatterBuilder灵活构建解析格式,完美匹配原始字符串的特殊分隔符 MICRO_OF_SECOND专门处理6位微秒,对应Oracle的FF格式- 目标格式里的
HH对应Oracle的HH24,mm对应MI,SSSSSS对应FF
旧版本Java兼容方案(Java 7及以下)
如果你的项目还在使用Java 7或更早版本,只能通过手动拆分字符串来处理微秒,因为SimpleDateFormat不支持微秒解析:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; private String formatDate(String refCrtdTs) { // 拆分原始字符串,分离日期时间和微秒部分 String[] mainParts = refCrtdTs.split("\\. "); if (mainParts.length != 2) { // 处理格式异常的情况 return null; } // 把日期部分的点替换成空格,变成"2018-4-24 8 1" String dateTimeStr = mainParts[0].replace('.', ' '); // 拆分时间和微秒部分 String[] timeMicroParts = mainParts[1].split("\\."); if (timeMicroParts.length != 2) { return null; } String secondStr = timeMicroParts[0]; // 截取前6位作为微秒 String microStr = timeMicroParts[1].substring(0, 6); // 解析日期时间到秒级 SimpleDateFormat parser = new SimpleDateFormat("yyyy-M-dd H m s"); Date date = null; try { date = parser.parse(dateTimeStr + " " + secondStr); } catch (ParseException e) { e.printStackTrace(); return null; } // 格式化到秒,再拼接微秒 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return formatter.format(date) + "." + microStr; }
内容的提问来源于stack exchange,提问作者Aadil
相关产品推荐
相关产品推荐

