【问题标题】:How can I convert a Joda's Duration to a java.time.Duration?如何将 Joda 的 Duration 转换为 java.time.Duration?
【发布时间】:2020-02-26 13:05:44
【问题描述】:

我想将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,因为我与其他一些期望java.time.* 的API/库进行交互。

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

【问题讨论】:

  • 不是真的,在那个问题中,OP 根本没有尝试将 org.joda.time.Period 的一个实例转换为 java.time.Period 的一个实例。他在问如何用java.time.Period 替换 joda 的Period,所以他根本没有任何joda 的实例。我想要一个 joda 的 Period (因为我有更多的选项可以在那里解析)和一个 java.time.Period (以及 java.time.Duration )因为我有其他代码需要这种类型的输入。

标签: java jodatime java-time


【解决方案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 字符串只是为了将其解析回来感觉很浪费。

【讨论】:

    【解决方案2】:

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

    的秒数

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

    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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 2011-06-07
      • 2020-02-29
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2013-06-28
      相关资源
      最近更新 更多