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

问题描述 投票:2回答:2

我想将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

[请记住,我没有像org.joda.time.Period一样尝试从代码中删除Converting org.joda.time.Period to java.time.Period的用法。我仍然想拥有一个org.joda.time.Period,因为我有更多的解析选项来生成它们,并且我还需要一个java.time.Period / java.time.Duration,因为我与其他一些期望java.time.*的API /库进行了交互。

所以,有没有办法将org.joda.time.Duration转换为java.time.Duration

java jodatime java-time
2个回答
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());

0
投票

我正在提出三个选项

  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字符串只是将其解析回是一种浪费。

© www.soinside.com 2019 - 2024. All rights reserved.