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

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

核心改动说明

  1. 用Duration替代Seconds创建周期:
    Duration代表一段精确的持续时间,能完整地将秒数转换为包含天、小时、分钟的Period,而不是只保留秒字段。
  2. 指定PeriodType.dayTime():
    明确告诉Joda Time我们需要的是包含天、小时、分钟的周期类型,确保这些字段被正确计算和存储。
  3. 修正后缀配对:
    原来的分钟后缀只写了单数,补上复数后缀后,格式化结果会根据数值自动切换单复数(比如1 minute / 5 minutes);小时的后缀也调整为规范的单复数配对形式。

验证示例

输入123456秒,计算逻辑为:

  • 1天 = 86400秒
  • 剩余37056秒 → 10小时 = 36000秒
  • 剩余1056秒 → 17分钟 = 1020秒
    最终输出:1 day, 10 hours 17 minutes,完全符合你的预期格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:06:52