Java中SQL Timestamp转换为OffsetDateTime失败的解决求助
解决SQL Timestamp转OffsetDateTime的问题
你的问题出在两个核心点:一是用了ISO_OFFSET_DATE_TIME格式化器,但它要求的是带时区偏移的日期格式(比如2023-07-17T12:22:02.626948+08:00),而你拿到的日期字符串没有时区信息,格式完全不匹配;二是没必要把Timestamp转成字符串再解析,直接类型转换更高效靠谱。
给你两种可行的解决方法:
方法一:直接转换Timestamp(推荐)
row.get("date_column")返回的本质是java.sql.Timestamp对象,直接转成OffsetDateTime即可,不用绕字符串:
// 先强转成Timestamp类型 Timestamp timestamp = (Timestamp) row.get("date_column"); // 转成Instant后,指定时区得到OffsetDateTime(这里用系统默认时区,也可换成ZoneOffset.UTC等业务需要的时区) OffsetDateTime dateColumn = timestamp.toInstant().atOffset(ZoneOffset.systemDefault());
方法二:自定义格式化器解析字符串(仅当必须用字符串处理时用)
如果一定要通过字符串解析,得先定义匹配你日期格式的格式化器,再给解析出的LocalDateTime补充时区信息转成OffsetDateTime:
// 自定义匹配"yyyy-MM-dd HH:mm:ss.SSSSSS"格式的格式化器 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"); // 先解析成LocalDateTime(原字符串无时区,只能先转这个类型) LocalDateTime localDateTime = LocalDateTime.parse(row.get("date_column").toString(), formatter); // 指定时区转成OffsetDateTime,比如系统默认时区或UTC OffsetDateTime dateColumn = localDateTime.atOffset(ZoneOffset.systemDefault());
注意:原日期字符串没有时区信息,所以必须手动指定一个合法时区(比如系统默认、业务要求的时区),否则无法生成OffsetDateTime——因为OffsetDateTime强制要求包含时区偏移量。
内容的提问来源于stack exchange,提问作者Great Gale
相关产品推荐
相关产品推荐

