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
相关产品推荐
相关产品推荐

