如何将Joda的Duration转换为java.time.Duration?

时间:2019-10-31 07:43:24

标签: java jodatime java-time

我想将类似1d2h3m4s的字符串解析为java.time.Duration。我可以使用joda的PeriodFormatter将字符串解析为org.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

请记住,我没有像Converting org.joda.time.Period to java.time.Period一样尝试从代码中删除org.joda.time.Period的用法。我仍然想拥有一个org.joda.time.Period,因为我有更多的解析选项来生成这些解析器,并且我需要一个java.time.Period / java.time.Duration,因为我与其他一些期望{{1 }}。

因此,有没有办法将java.time.*转换为org.joda.time.Duration

2 个答案:

答案 0 :(得分:1)

我要提出三个选择

  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为止的所有内容都应放在ISO字符串T之前。其他所有内容都放在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字符串只是将其解析回是一种浪费。

答案 1 :(得分:0)

您可以使用org.joda.time.PeriodPeriodFormatter#parse()返回的Period#toStandardSeconds()#getSeconds()转换为秒。这将为您提供int

的秒数

然后使用java.time.Duration.ofSeconds()从该java.time.Duration创建一个int

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

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

Period myPeriod = formatter.parsePeriod("1d2h3m4s");

java.time.Duration myDuration = java.time.Duration.ofSeconds(
        myPeriod.toStandardSeconds().getSeconds());