我想将任何持续时间/周期字符串文字(以下面示例中显示的格式)解析为Java中的周期/持续时间实例。
所谓持续时间/周期,我指的是包含基于日期和基于时间的数量的时间量。在Java中,Duration
仅适用于基于时间的量,如秒、分钟和小时,而Period
,仅适用于日期量,如年、月和日。
要解析的字符串并不总是包含所有量。
例子:
29天23小时59分20秒
< li>
4年10个月10秒
< li>
10天9分钟
< li>
1个月
如果可能的话,我会怎么做?
我的想法是使用ThreeTen Extra项目的< code>PeriodDuration类。它结合了您已经提到的< code>Period和< code>Duration类。一个限制是它的< code>parse方法只接受ISO 8601格式,所以我们需要先把你的字符串转换成那种格式。ISO 8601格式就像< code > p 10 dt 9m 10天9分钟。< code>P是固定的。如果有时间部分(小时、分钟、秒)与基于日期的部分(年、月、周、日)分开,则< code>T标记基于时间的部分的开始。一个很好的结果是,我们总能分辨出< code>M是表示月还是分钟:如果< code>M在< code>T之前,或者没有< code>T,则表示月。如果< code>T之后是< code>M,则表示分钟。我的第一个代码片段将您的字符串转换为ISO 8601。
String[] examples = {
"29 days 23 hours 59 minutes 20 seconds",
"4 years 10 months 10 seconds",
"10 days 9 minutes",
"1 month"
};
for (String pds : examples) {
// If hours, minutes or seconds are present, put a T before them
String temp = pds.replaceFirst("(\\d+ *(?:hour|minute|second))", " T $1");
// Abbreviate all units to 1 letter; remove spaces
temp = temp.replaceAll("([ymwdhms])[a-z]*", "$1").replace(" ", "");
// Prepend P
String iso = "P" + temp;
System.out.println(iso);
}
到目前为止的输出是:
P29dT23h59m20s
P4y10mT10s
P10dT9m
P1m
在此之后,我们应该能够解析:
PeriodDuration pd = PeriodDuration.parse(iso);
我还没有安装Three-Ten Extra,所以在发布前我没有尝试过最后一行。OP在一篇评论中报告说,它在Three-Ten Extra 1.6.0上像一个符咒一样工作。唯一需要注意的是,在解析字符串时,单位必须按降序排列,否则它会抛出<code>DateTimeParseException。
不要担心ISO 8601格式通常是大写的,而你的单位是小写的。< code>parse方法的文档说明:
这些部分的ASCII后缀为“Y”表示年份,“M”表示月份,“W”表示周,“D”表示天,“H”表示小时,“M”代表分钟,“S”表示秒,可采用大写或小写形式。
编辑:感谢Arvind Kumar Avinash的评论,如果您也需要接受大写字母,请在正则表达式中添加(? i)
标志表达式以启用不区分大小写的匹配:
temp = temp.replaceAll("(?i)([ymwdhms])[a-z]*", "$1").replace(" ", "");
PeriodDuration.parse()
的文档问题内容: 我需要将持续时间字符串解析为毫秒形式。 我希望像这样的持续时间相等,但是我什么也找不到。有人会建议为此目的使用或支持SDF吗? 我目前的计划是使用正则表达式来匹配数字并做类似的事情 然后使用TimeUnit将它们放在一起并转换为毫秒。 我想我的问题是,这似乎有点过头了,它可以轻松完成吗?出现了很多有关日期和时间戳的问题,但这也许有些不同。 问题答案: 使用a 是一种合理的方法。但是,为
问题内容: 我正在使用sql server 2008 r2。我正在尝试在 FromDate 和 Todate 之间按24小时周期范围划分行。例如,如果给定的时间行如下(( FromDate 和 Todate 之间的范围是4天,那么我要4行) 我想要看到的结果是这样的: 问题答案: 试试这个查询:
我需要一些解释为什么这个代码不编译: 错误: 类型Duration中的(TemporalAmount)方法不适用于参数(ChronoUnit) 正如本文所述: public static Duration from(TemporalAmount amount)从时间量中获取持续时间的实例。这将根据指定的金额获得持续时间。TemporalAmount表示一个时间量,可以是基于日期的,也可以是基于时间
本实例演示了如何通过DateFormat类的parse方法根据不同的本地环境解析日期/时间字符串,并将其转换成Date对象。在最后还演示了parse方法如何解析不符合日期/时间逻辑的字符串。 例子 : 解析日期/时间字符串 实例的代码如下: package chapter8; import java.text.DateFormat; import java.util.Date; import ja
我有DateTime字符串2020-04-03 01:29:27和2020-04-03 01:29:37我想得到持续时间在小时。我已经尝试了很多东西,但这却找不到任何帮助
如何将字符串日期格式转换为日期,我有格式为以下格式的日期字符串: 接下来,我尝试了,但没有运气。 所有上述语句都存在解析错误。