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

如何将数据库取出的格式化字符串转回Java Date变量?

把日期字符串转回Date对象的高效方法

嘿,刚好碰到过类似的场景,我来给你梳理两种可行的方法,重点推荐更高效安全的现代方案!


方法一:沿用你原来的SimpleDateFormat(旧版Java兼容)

既然你存的时候用的是SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),那取出来转回去直接用同一个格式器的parse()方法就行,代码大概是这样:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    Date date = format.parse(从数据库取出的字符串);
    // 拿到Date对象了
} catch (ParseException e) {
    // 处理解析异常,比如格式不匹配的情况
    e.printStackTrace();
}

不过要注意SimpleDateFormat是线程不安全的,如果是在多线程环境(比如Web应用)里,千万别把它做成静态变量重复用,不然会出现各种诡异的解析错误。要么每次用的时候新建实例,要么用ThreadLocal来封装。


方法二:用Java 8+的java.time包(更高效、更安全)

从Java 8开始,官方推荐用java.time下的新日期API,它是线程安全的,而且设计更合理,性能也更好。你的场景可以这样处理:

首先,定义一个全局的DateTimeFormatter(因为是不可变线程安全的,放心做成静态常量):

private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

然后解析字符串,再转成Date对象(如果确实需要Date的话,因为新API里更推荐用LocalDateTime):

String dbDateStr = 从数据库取出的字符串;
// 先解析成LocalDateTime
LocalDateTime localDateTime = LocalDateTime.parse(dbDateStr, DATE_TIME_FORMATTER);
// 如果需要转成java.util.Date的话
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

如果你不需要Date对象,直接用LocalDateTime会更方便,毕竟新API功能更强大。


关于“最高效”的说明

如果是单线程场景,两种方法性能差不太多,但多线程场景下,java.time的方案完胜——因为DateTimeFormatter可以全局复用,不用每次创建实例,也没有线程安全问题,这才是真正高效的用法。而且新API的解析逻辑更严谨,不容易出奇怪的bug。

内容的提问来源于stack exchange,提问作者S. Rhodes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:12:11