如何将数据库取出的格式化字符串转回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
相关产品推荐
相关产品推荐

