如何在DAO类中将数据库Timestamp转换为指定格式的Date?
更简洁安全的Timestamp转Date方案
嘿,你的代码其实能实现需求,但绕了不必要的弯路,而且还有线程安全的潜在问题,我来给你优化一下:
直接转换(最简便的方式)
Timestamp本身就是java.util.Date的子类,如果你不需要刻意只保留时分部分,而是要完整的日期时间(只是用Date类型存储),直接用getTime()方法获取毫秒数构造Date就行,完全不用转字符串:
Timestamp dbDate = rows.getTimestamp("event_date"); // 直接基于Timestamp的毫秒数创建Date Date eventDate = new Date(dbDate.getTime()); e.setEventDate(eventDate);
如果你只需要保留时分部分(去掉日期)
如果你的业务场景是只需要HH:mm对应的时间(日期部分统一为1970-01-01),那你的思路是对的,但要注意SimpleDateFormat是线程不安全的,不能每次调用都新建实例,建议把它声明为静态常量:
// 把SimpleDateFormat声明为类的静态常量,避免重复创建和线程安全问题 private static final SimpleDateFormat TIME_FORMATTER = new SimpleDateFormat("HH:mm"); // 转换逻辑 Timestamp dbDate = rows.getTimestamp("event_date"); String timeStr = TIME_FORMATTER.format(dbDate); Date timeOnlyDate = TIME_FORMATTER.parse(timeStr); e.setEventDate(timeOnlyDate);
推荐:使用Java 8+的新时间API(更安全)
旧的Date、Timestamp、SimpleDateFormat都属于过时API,线程不安全且设计有缺陷,推荐用Java 8引入的java.time包来处理:
Timestamp dbDate = rows.getTimestamp("event_date"); // 先转成LocalDateTime,再提取时分部分 LocalTime targetTime = dbDate.toLocalDateTime().toLocalTime(); // 将时分转换为Date(日期部分用纪元起始日1970-01-01) ZonedDateTime zonedDateTime = LocalDate.EPOCH.atTime(targetTime) .atZone(ZoneId.systemDefault()); Date eventDate = Date.from(zonedDateTime.toInstant()); e.setEventDate(eventDate);
这样既避免了线程安全问题,代码可读性也更高。
内容的提问来源于stack exchange,提问作者majkoz0rd
相关产品推荐
相关产品推荐

