Java中含保留字符的字符串转Date类型的解析问题求助
解决JDBC风格时间戳字符串的解析问题
看到你遇到了JDBC格式的时间戳字符串解析问题,不想通过字符串预处理来解决,那我们可以利用Java的日期格式化API来直接处理这种带固定前缀后缀的格式,分两种方案给你:
推荐方案:使用Java 8+的DateTimeFormatter(更可靠、灵活)
SimpleDateFormat是过时且线程不安全的API,Java 8引入的java.time包下的DateTimeFormatter是更好的选择,它支持拼接固定文本和格式模式,完美适配你的场景:
代码示例
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.util.Locale; public class JdbcTimestampParse { public static void main(String[] args) { String dateInString = "{ts '2021-03-24 12:52:38.933'}"; // 构建格式化器:先匹配固定前缀{ts ',再匹配日期时间,最后匹配固定后缀'} DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendLiteral("{ts '") // 添加固定前缀 .appendPattern("yyyy-MM-dd HH:mm:ss[.SSS]") // 匹配日期时间,[.SSS]表示毫秒可选 .appendLiteral("'}") // 添加固定后缀 .toFormatter(Locale.ENGLISH); // 解析为LocalDateTime(如果需要时区可以用ZonedDateTime) LocalDateTime dateTime = LocalDateTime.parse(dateInString, formatter); System.out.println("解析结果:" + dateTime); // 输出 2021-03-24T12:52:38.933 // 如果需要转换为旧版java.util.Date(兼容旧代码) // Date legacyDate = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()); // System.out.println("旧版Date:" + legacyDate); } }
方案优势
- 支持可选模式(比如
[.SSS]表示毫秒部分可有可无,若需要支持时区可添加[Z]) - 线程安全,适合多线程环境
- API设计更清晰,避免复杂的转义逻辑
兼容旧版:修正SimpleDateFormat的格式串
如果你必须使用SimpleDateFormat,需要修正格式串的转义逻辑,同时去掉原格式串中错误的{.SSS}和[Z](你的输入字符串里没有这些内容):
代码示例
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class LegacyDateParse { public static void main(String[] args) { String dateInString = "{ts '2021-03-24 12:52:38.933'}"; // 关键:用两个单引号''表示字符串中的一个单引号,其他字符直接匹配 SimpleDateFormat sdf = new SimpleDateFormat("{ts ''yyyy-MM-dd HH:mm:ss.SSS''}", Locale.ENGLISH); try { Date date = sdf.parse(dateInString); System.out.println("解析结果:" + date); // 输出 Wed Mar 24 12:52:38 CST 2021 } catch (ParseException e) { e.printStackTrace(); } } }
注意事项
SimpleDateFormat不支持可选模式,如果你的输入有时没有毫秒或有时带时区,这种方式会失效SimpleDateFormat是线程不安全的,多线程环境下需要注意同步或每个线程单独创建实例
内容的提问来源于stack exchange,提问作者hari krishna
相关产品推荐
相关产品推荐

