我想用H:MM:SS这样的模式格式化持续时间(以秒为单位).java中的当前实用程序旨在格式化时间而不是持续时间.
在Java 8及更高版本中可用Duration的新JSR 310 date API(java.time包)中的类中,javadoc说:
此类以秒和纳秒为单位模拟时间量或时间量.它可以使用其他基于持续时间的单位进行访问,例如分钟和小时.此外,DAYS单位可以使用,并且被视为完全等于24小时,因此忽略了夏令时效果.
那么,为什么以下代码崩溃?
Duration duration = Duration.ofSeconds(3000);
System.out.println(duration.get(ChronoUnit.MINUTES));
Run Code Online (Sandbox Code Playgroud)
这提出了一个UnsupportedTemporalTypeException:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Minutes
at java.time.Duration.get(Duration.java:537)
Run Code Online (Sandbox Code Playgroud)
那么从持续时间对象中提取分钟和小时的推荐方法是什么?我们是否必须从秒数开始计算?为什么这样实现?
我希望能够以时间解析时间(天,小时,分钟)+可选的字符串,所以输入如下所示:<time>(white_spaces)<optional_string>。我知道正则表达式是处理这些事情的正确工具,所以我想出了这样的表达:
Pattern.compile("((?<days>\\d+)d)?((?<hours>\\d+)h)?((?<minutes>\\d+)m)?\\s+?(?<reason>.+)?");
Run Code Online (Sandbox Code Playgroud)
基本上它按预期工作,但是在此表达式中,所有时间组(天、小时、分钟)都是可选的,我希望输入至少包含分钟组。但是,如果指定了小时或天,则不需要分钟。此外,时间组(d+h、h+m、d+m、d+h+m)的所有组合都是可能的。那么我该如何纠正我的表达呢?或者也许有其他方法来解析一段时间?
编辑:输入示例:
12h64m - 正确的
12d43m dsd - 正确的
- 空字符串 - 不正确
12m - 正确的
12d32h43m - 正确的
sdsds - 不正确 - 没有“指定时间组”