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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:43:11