どのように私はジョダの持続時間はjava.time.Durationに変換することができますか?

ecerulm:

私のような文字列を解析する1d2h3m4sにはjava.time.Duration私はジョダのを使用することができますPeriodFormatterに文字列を解析することorg.joda.time.Durationが、私は、標準Java8のにそれを変換する方法を見つけ出すことはできませんjava.time.Duration

私はすでに期待しているいくつかの「レガシー」コードのインターフェイスを持っているjava.time.Duration入力として、私はジョダのを使いたいparsePeriodので、java.time.Duration.parse()(唯一のISO-8601期間形式を受け入れ1d2h3m4sISO-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にように私のコードからjava.time.Periodにorg.joda.time.Periodを変換します私はまだ持っていたいorg.joda.time.Period、私はより多くのものを生成するためのオプションを解析している、と私は必要があるため、java.time.Period/ java.time.Duration期待していくつかの他のAPI /ライブラリとIの相互作用ためにjava.time.*

だから、変換する方法があるorg.joda.time.Durationにはjava.time.Duration

オレVV:

私は3つのオプションを提示しています

  1. それはとても手がISO 8601形式の文字列を変更しjava.time.Duration、それを解析することができます。
  2. ミリ秒のカウントによって変換します。
  3. から変換しますjoda.time.Duration.toString()

文字列を変更します

個人的に私は、私はこのためにジョダ-時間的に依存したいとは思いません。代わりに、私は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によって答えのものと同様のアイデアです。私はミリ秒単位ではなく秒で依存しているので、私は、ジョダ-継続時間のミリ秒の精度を失いたくありませんでした(私はあなたの例の文字列を、それは違いはありませんでしょうことを知っています)。

    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文字列に時間をフォーマットします。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=331565&siteId=1