为什么这个输入是 Joda-Time PeriodFormatter 的无效格式?

Why is this input an invalid format for Joda-Time PeriodFormatter?

我正在尝试将 1h 30m 5s5m38s1h 3s 之类的字符串转换为表示总时间(以秒为单位)的整数值。因此,例如,1m 20s 将导致 80 秒的整数值。

我正在使用 Joda 时间:

PeriodFormatter formatter = new PeriodFormatterBuilder()
        .appendDays().appendSuffix("d").appendSeparatorIfFieldsAfter(" ")
        .appendHours().appendSuffix("h").appendSeparatorIfFieldsAfter(" ")
        .appendMinutes().appendSuffix("m").appendSeparatorIfFieldsAfter(" ")
        .appendSeconds().appendSuffix("s")
        .toFormatter();

int time = formatter.parsePeriod("30s").getSeconds(); //Throws IllegalArgumentException

几乎对我传入的每个字符串都抛出 IllegalArgumentException,提示“格式无效”。

我不明白为什么这不起作用。如果没有得到 illegalArgumentException,我不能将任何东西传递给它。有人对如何调整我的格式化程序设置以获得我想要的结果有任何指导吗?

Joda-Time 项目现在处于维护模式。它的创建者继续领导 JSR 310,它带来了 java.time 类 现在内置到 Java 8 和更高版本中。

未附加到时间线的 ISO 8601 标准 format for a span of timePnYnMnDTnHnMnS,其中 P 标记开始,T 分隔两个部分。

java.time类在parsing/generating文本时默认使用ISO 8601标准格式。因此无需指定格式模式。

所以我会用简单的文本操作来解决你的问题。删除你的 SPACE 个字符。改为大写。

java.time.Duration.parse( "PT" + "1h 30m 5s".replace( " " , "" ).toUpperCase() )