Spring Boot中R2DBC的Interval转Duration转换异常问题
问题原因与修复方案
你的转换逻辑存在只提取单一时间单位的错误:
- 传入的Interval对象包含
365 days但minutes字段为0,而你的方法仅通过data.getMinutes()来构建Duration,自然返回PT0S(0分钟对应的Duration)。 io.r2dbc.postgresql.codec.Interval是PostgreSQL风格的时间间隔类型,它拆分了年、月、日、时、分、秒等多个独立字段,不能仅读取某一个字段来完成完整转换。
正确的转换实现(忽略年/月,因为其时长不固定)
import io.r2dbc.postgresql.codec.Interval; import java.time.Duration; Duration fromInterval(Interval data) { if (data == null) { return null; } // 累加所有固定时长的时间单位 return Duration.ofDays(data.getDays()) .plusHours(data.getHours()) .plusMinutes(data.getMinutes()) .plusSeconds((long) data.getSeconds()) .plusNanos((long) (data.getSeconds() % 1 * 1_000_000_000)); }
若需要处理年/月(需做近似转换)
由于年、月的实际时长不固定(如2月天数、闰年差异),需根据业务规则做近似估算,示例如下:
import io.r2dbc.postgresql.codec.Interval; import java.time.Duration; Duration fromIntervalWithYearMonth(Interval data) { if (data == null) { return null; } // 按365天/年、30天/月做近似转换 long approximateDays = data.getYears() * 365 + data.getMonths() * 30 + data.getDays(); return Duration.ofDays(approximateDays) .plusHours(data.getHours()) .plusMinutes(data.getMinutes()) .plusSeconds((long) data.getSeconds()) .plusNanos((long) (data.getSeconds() % 1 * 1_000_000_000)); }
内容的提问来源于stack exchange,提问作者Aditya Tiwari
相关产品推荐
相关产品推荐

