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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:38:27