我目前在我的Android应用程序中运行少量shell命令并解析我的应用程序上的shell输出。
目前我的shell输出也返回上一次输出之间的持续时间。持续时间是这样的 - 时间= + 1d1h55m15s584ms
现在我被困在这里。如果无论如何要将这个持续时间计算为毫秒或将其转换为精确的时间戳?
答案 0 :(得分:2)
您是否可以控制该字符串生成?如果是这样,请使用标准格式。
ISO 8601标准定义了许多用于表示日期时间值的文本格式。这包括format for durations,例如您的PnYnMnDTnHnMnS
,其中P
标记开头,T
将年 - 月 - 日与小时 - 分 - 秒分开。< / p>
例如,一个半小时是PT1H30M
。
Java 8及更高版本中内置的java.time类,并反向移植到Java 6&amp; 7&amp; Android,默认情况下使用ISO 8601格式进行解析和生成字符串。
java.time类表示作为Period
对象的年 - 月 - 天,以及作为Duration
对象的小时 - 分钟 - 秒。
String input = "P1DT1H55M15.584S";
Duration d = Duration.parse ( input );
d.toString():PT25H55M15.584S
d.toMillis():93315584
d.toNanos():93315584000000
如果你无法控制输入字符串的格式,我会考虑将这些输入操作为标准格式。添加P
,插入T
,然后将ms
部分更改为小数部分。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
答案 1 :(得分:0)
大多数答案表明字符串输入预处理的主要问题是输入字符串通常无法更改。
因此调整解析例程通常更灵活,而不是输入。
您必须编写自己的解析例程代码,或者您可以使用我的库Time4A,它可以直接支持解析pattern base上的持续时间(而不是@Basil Bourque回答中建议的ThreetenABP)然后使用此代码(版本v3.28或更高版本):
String input = "+1d1h55m15s584ms";
String pattern = "+[#D'd'][#h'h'][#m'm'][#s's'][fff'ms']";
long totalMillis =
Duration.formatter(pattern)
.parse(input)
.toClockPeriodWithDaysAs24Hours()
.with(ClockUnit.MILLIS.only())
.getPartialAmount(ClockUnit.MILLIS);
System.out.println(totalMillis); // 93315584
详细说明
关于模式语法:
解析输入后,解析的持续时间需要分两步进行标准化:首先将整个持续时间转换为基于时钟单位的持续时间(处理天数为24小时),然后仅标准化为毫秒。在第二步之后,我们知道部分数量(以毫秒为单位)也是总数(希望的结果)。