JodaTime PeriodFormatter格式化异常求助:秒转天时分无输出
问题分析与解决方案
我来帮你搞定这个问题——你的代码里有个关键的小疏漏,导致格式化器找不到需要展示的天、小时、分钟字段,所以才会返回空字符串;加上appendSeconds()后也只会显示秒数,原因也在这里。
问题根源
你当前通过Seconds.seconds(seconds.toInt())创建Period对象,但Joda Time中,这种方式生成的Period只会包含「秒」这一个字段,天、小时、分钟的字段值全部为0。而你的格式化器设置了printZeroRarelyLast(),这些值为0的字段会被自动忽略,最终就输出了空字符串;如果加上appendSeconds(),只会显示秒数,因为只有这个字段有有效值。
修正后的代码
我们需要先把秒数转换成包含天、小时、分钟的完整Period,同时修正格式化器里的小细节(比如分钟的复数后缀缺失):
// 假设你的输入秒数是这个变量 val inputSeconds = 123456L // 构建正确的格式化器 val periodFormatter = PeriodFormatterBuilder() .appendDays() .appendSuffix(" day", " days") // 单数/复数后缀配对 .appendSeparator(", ") .appendHours() .appendSuffix(" hour", " hours") // 修正为单数+复数的规范写法 .appendSeparator(" ") .appendMinutes() .appendSuffix(" minute", " minutes") // 补上缺失的复数后缀 .printZeroRarelyLast() .toFormatter() // 关键改动:用Duration转换为包含天、时、分的Period val duration = Duration.standardSeconds(inputSeconds) val period = duration.toPeriod(PeriodType.dayTime()) // 执行格式化 val formattedResult = period.toString(periodFormatter) println(formattedResult) // 示例输出:1 day, 10 hours 17 minutes
核心改动说明
- 用
Duration替代Seconds创建周期:Duration代表一段精确的持续时间,能完整地将秒数转换为包含天、小时、分钟的Period,而不是只保留秒字段。 - 指定
PeriodType.dayTime():
明确告诉Joda Time我们需要的是包含天、小时、分钟的周期类型,确保这些字段被正确计算和存储。 - 修正后缀配对:
原来的分钟后缀只写了单数,补上复数后缀后,格式化结果会根据数值自动切换单复数(比如1 minute / 5 minutes);小时的后缀也调整为规范的单复数配对形式。
验证示例
输入123456秒,计算逻辑为:
- 1天 = 86400秒
- 剩余37056秒 → 10小时 = 36000秒
- 剩余1056秒 → 17分钟 = 1020秒
最终输出:1 day, 10 hours 17 minutes,完全符合你的预期格式。
内容的提问来源于stack exchange,提问作者André
相关产品推荐
相关产品推荐

