java - 如何将 Joda 的 Duration 转换为 java.time.Duration?
问题描述
我想将一个字符串解析1d2h3m4s
为java.time.Duration
. 我可以使用 jodaPeriodFormatter
将字符串解析为 aorg.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
请记住,我并不是想org.joda.time.Period
从我的代码中删除org.joda.time.Period 到 java.time.Period 中的使用。我仍然想要一个org.joda.time.Period
,因为我有更多的解析选项来生成它们,而且我需要一个java.time.Period
/java.time.Duration
因为我与其他一些期望java.time.*
.
那么,有没有办法将 a 转换org.joda.time.Duration
为 a java.time.Duration
?
解决方案
我提出三个选项
- 手动将字符串修改为 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 字符串只是为了将其解析回来感觉像是一种浪费。
推荐阅读
- go - 在 Gorm 中动态获取字段的大小
- javascript - Nodemailer SMTP 服务器收到电子邮件但没有任何响应
- python - 未使用 Python 类方法?
- laravel - Maats Laraval Excel:您可以使用多个查询导出吗?
- python - 以更有效/Pythonic 的方式调整一组行的数字比例?
- java - 尝试使用 KeyboardFocusManager 查找当前聚焦的窗口总是会导致错误消息
- c++ - 使用#include 找不到文件错误错误
- javascript - Javascript .multiply'找不到函数'
- flutter - 未处理的异常:NoSuchMethodError:在 null 上调用了方法“[]”。尝试调用:[]("username")
- image-segmentation - 在 Canny 边缘检测中应用自适应阈值