Я представляю три варианта
- Вручную измените строку в формат ISO 8601, чтобы
java.time.Duration
мог ее проанализировать. - Преобразовать в счетчик миллисекунд.
- Конвертировать из
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
, включая T
в строке ISO. Все остальное ставится после 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 только для ее анализа выглядит как пустая трата времени.