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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:28:23