时刻与时间跨度这显然是一个不幸的设计决定,采用数据类型来表示一个时刻,时间轴上的一个特定点,(TIMESTAMP WITH TIME ZONE在标准 SQL 中)并滥用它来存储未附加到时间轴的时间跨度。从数据库中检索时刻鉴于示例文本的格式,我怀疑数据实际上可能存储在日期时间类型的列中。仔细检查您关于列的陈述VARCHAR(或者如果它确实是VARCHAR,请一直阅读到本答案的结尾)。在内部,该数据类型可能存储自 1970 UTC 第一时刻的纪元参考以来的毫秒数或微秒数。所以我们的目标是达到这个数字。OffsetDateTime使用 JDBC 4.2 或更高版本的驱动程序将伪矩作为对象检索。OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;如果您只关心 while 秒并且不想忽略小数秒,请调用toEpochSecond().long secondsSinceEpoch = odt.toEpochSecond() ;将该计数传递给Duration班级。此类用于表示未附加到时间轴的时间跨度,时间范围为小时-分钟-秒加上小数秒。Duration d = Duration.ofSeconds( secondsSinceEpoch ) ;然后,您可以生成标准 ISO 8601 格式的字符串。String output = d.toString() ;对于 5 分 46 秒的示例,那将是:PT5M46S您可以查询小时、分钟和秒部分。long hours = d.toHoursPart() ;long minutes = d.toMinutesPart() ;… 等等。如果您关心亚秒级的细节,请将您的OffsetDateTime对象转换为更基本的类型Instant。Instant instant = odt.toInstant() ;然后以纳秒为单位提取整秒和小数秒。long seconds = instant.getEpochSecond() ;int nanos = instant.getNano() ;喂那些给Duration。Duration d = Duration.ofSeconds( seconds , nanos ) ;从数据库中检索文本如果您确定您的原始值存储为文本,那么这将是一个更棘手的设计决策。通过将中间的 SPACE 用T.String input = "1970-01-01 00:05:46".replace( " " , "T" ) ;解析为 aLocalDateTime因为我们缺少时区指示符或与 UTC 的偏移量。LocalDateTime ldt = LocalDateTime.parse( input ) ;应用与 UTC 的偏移量以获得OffsetDateTime.OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;从那里,继续如上所述。