私のような文字列を解析する1d2h3m4s
にはjava.time.Duration
。私はジョダのを使用することができますPeriodFormatter
に文字列を解析することorg.joda.time.Duration
が、私は、標準Java8のにそれを変換する方法を見つけ出すことはできませんjava.time.Duration
。
私はすでに期待しているいくつかの「レガシー」コードのインターフェイスを持っているjava.time.Duration
入力として、私はジョダのを使いたい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
にように私のコードから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
?
私は3つのオプションを提示しています
- それはとても手がISO 8601形式の文字列を変更し
java.time.Duration
、それを解析することができます。 - ミリ秒のカウントによって変換します。
- から変換します
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
前に配置されたT
ISO文字列インチ 他のすべての後に置かれています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文字列に時間をフォーマットします。