我想将类似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
,因为我与其他一些期望{{1 }}。
因此,有没有办法将java.time.*
转换为org.joda.time.Duration
?
答案 0 :(得分:1)
我要提出三个选择
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
为止的所有内容都应放在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字符串只是将其解析回是一种浪费。
答案 1 :(得分:0)
您可以使用org.joda.time.Period
将PeriodFormatter#parse()
返回的Period#toStandardSeconds()#getSeconds()
转换为秒。这将为您提供int
然后使用java.time.Duration.ofSeconds()
从该java.time.Duration
创建一个int
。
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());