首页 > 解决方案 > 如何将 Joda 的 Duration 转换为 java.time.Duration?

问题描述

我想将一个字符串解析1d2h3m4sjava.time.Duration. 我可以使用 jodaPeriodFormatter将字符串解析为 aorg.joda.time.Duration但我不知道如何将其转换为标准 Java8 的java.time.Duration.

我必须连接一些已经期望java.time.Duration作为输入的“遗留”代码,但我想使用 joda,parsePeriod因为java.time.Duration.parse()它只接受 ISO-8601 持续时间格式(1d2h3m4s不符合 ISO-8601 持续时间)

import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;

...

final PeriodFormatter periodFormatter = new PeriodFormatterBuilder()
        .printZeroNever()
        .appendDays().appendSuffix("d")
        .appendHours().appendSuffix("h")
        .appendMinutes().appendSuffix("m")
        .appendSeconds().appendSuffix("s").toFormatter();

org.joda.time.Duration myduration = periodFormatter.parsePeriod("1d1s").toStandardDuration(); 
java.util.time myduration2 = XXXXX

请记住,我并不是想org.joda.time.Period从我的代码中删除org.joda.time.Period 到 java.time.Period 中的使用。我仍然想要一个org.joda.time.Period,因为我有更多的解析选项来生成它们,而且我需要一个java.time.Period/java.time.Duration因为我与其他一些期望java.time.*.

那么,有没有办法将 a 转换org.joda.time.Duration为 a java.time.Duration

标签: javajodatimejava-time

解决方案


我提出三个选项

  1. 手动将字符串修改为 ISO 8601 格式,以便java.time.Duration对其进行解析。
  2. 通过毫秒数转换。
  3. 从 转换joda.time.Duration.toString()

修改字符串

就我个人而言,我认为我不想依赖 Joda-Time。相反,我会将您的非 ISO 8601 字符串修改为 ISO 8601 格式。

    String durationString = "1d1s";
    // Convert to ISO 8601 format
    String isoString = durationString.replaceFirst("(.*?[Dd])?(.*)", "P$1T$2");
    java.time.Duration dur = java.time.Duration.parse(isoString);
    System.out.println(dur);

输出是:

PT24H1S

我承认正则表达式有点难以阅读。如果字符串中有大写或小写字母D,则所有内容都D放在TISO 字符串中的前面。其他所有内容都放在T.

毫秒级转换

这是一个类似于 ecerulm 答案中的想法。我不想失去 Joda-Time 持续时间的毫秒精度,所以我依赖毫秒而不是秒(我知道对于您的示例字符串,它不会有任何区别)。

    final PeriodFormatter periodFormatter = new PeriodFormatterBuilder()
            .printZeroNever()
            .appendDays().appendSuffix("d")
            .appendHours().appendSuffix("h")
            .appendMinutes().appendSuffix("m")
            .appendSeconds().appendSuffix("s").toFormatter();

    org.joda.time.Duration myduration = periodFormatter.parsePeriod("1d1s").toStandardDuration(); 

    java.time.Duration dur = java.time.Duration.ofMillis(myduration.getMillis());

结果和以前一样。

转换一个字符串

    java.time.Duration dur = java.time.Duration.parse(myduration.toString());

结果还是一样的。不过,将持续时间格式化为 ISO 8601 字符串只是为了将其解析回来感觉像是一种浪费。


推荐阅读