我提出了三种选择
手动将字符串修改为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 (包括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字符串只是为了解析它,这感觉很浪费。