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

Groovy中使用Calendar转换秒为时分秒结果异常问题

问题根因
  • 你当前使用的Calendar、GregorianCalendar都是用于处理特定时区下的日期时刻的工具类,天生不适合计算无日期绑定的纯时长。当你向秒数字段传入远超一天秒数(86400秒)的值时,类内部会自动按照日期进位规则做取模折算,超出天级的部分不会被计入小时数展示:
    对19045800秒做天级折算可得:19045800 ÷ 86400 = 220天,余37800秒,剩余的37800秒恰好是10小时30分,这就是你得到10:30:00结果的直接原因。
  • 额外要注意的是,日期类的格式化结果受运行环境默认时区影响,哪怕是同一个秒数,在不同时区的环境下运行会得到不同的时间值,根本无法输出稳定的总时长结果。
  • 你用的格式化占位符HH本身的定义就是展示当日小时数,取值范围固定为0-23,本身就不支持展示超过23的小时数值。
修正方案

不要用日期处理类做纯时长换算,直接通过算术运算拆分时、分、秒单位即可,实现稳定无兼容问题:

long totalSeconds = 19045800
// 逐位拆分单位
long hours = totalSeconds / 3600
long minutes = (totalSeconds % 3600) / 60
long seconds = totalSeconds % 60
// 格式化为HH:mm:ss格式,分、秒不足两位时前面补0
String duration = String.format("%d:%02d:%02d", hours, minutes, seconds)
echo duration
// 运行输出:5290:30:00,和实际换算结果完全一致

如果是JDK8及以上的运行环境,也可以用官方提供的java.time.Duration时长类处理,减少手动计算单位的出错概率:

import java.time.Duration

long totalSeconds = 19045800
Duration dur = Duration.ofSeconds(totalSeconds)
long hours = dur.toHours()
long minutes = dur.toMinutesPart()
long seconds = dur.toSecondsPart()
String duration = String.format("%d:%02d:%02d", hours, minutes, seconds)
echo duration

内容的提问来源于stack exchange,提问作者TestingCodes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:27:18