在Java中将HumanReadable时间解析为毫秒
我正在尝试将一个字符串(如4小时、1天或2个月)转换为毫秒。但是,我如何在不必检查string.contains(“h”)等的情况下有效地执行此操作呢 Node有,Java会有类似的东西吗 根据一些回答进行编辑:是的,实际数字可以更改,我给出了4个小时作为示例,但可以是1、2、3、5等。天数和月份相同。是的,它们彼此紧挨着。没有空间。 示例字符串:提醒学生上学在Java中将HumanReadable时间解析为毫秒,java,Java,我正在尝试将一个字符串(如4小时、1天或2个月)转换为毫秒。但是,我如何在不必检查string.contains(“h”)等的情况下有效地执行此操作呢 Node有,Java会有类似的东西吗 根据一些回答进行编辑:是的,实际数字可以更改,我给出了4个小时作为示例,但可以是1、2、3、5等。天数和月份相同。是的,它们彼此紧挨着。没有空间。 示例字符串:提醒学生上学 输出应该是:360000(毫秒)好吧,你可以把它分解成更小的部分 在字符串中查找此类事件 取数字部分和单位部分,乘以它们的值,得到毫秒
输出应该是:360000(毫秒)好吧,你可以把它分解成更小的部分
- 在字符串中查找此类事件李>
- 取数字部分和单位部分,乘以它们的值,得到毫秒数
(?\d+)(h |天|分钟|秒)
这样的正则表达式将匹配这些字符串。使用模式
和匹配器
会有所帮助
要将数字转换为毫秒,需要将单位映射到与该单位的毫秒数匹配的值。例如,
天
将映射到86400000天。虽然它没有内置,但我觉得它没有那么糟糕
String[] exampleStrings = { "4hours", "1day", "2months" };
for (String example : exampleStrings) {
long millis;
if (example.contains("hour") || example.contains("minute")
|| example.contains("second")) {
String durationString = "PT" + unitToAbbreviation(example);
Duration dur = Duration.parse(durationString);
millis = dur.toMillis();
} else {
String periodString = "P" + unitToAbbreviation(example);
Period per = Period.parse(periodString);
Duration estimatedDuration = Duration.ZERO;
for (TemporalUnit unit : per.getUnits()) {
estimatedDuration = estimatedDuration.plus(
unit.getDuration().multipliedBy(per.get(unit)));
}
millis = estimatedDuration.toMillis();
}
System.out.format("%7s -> %10d milliseconds%n", example, millis);
}
此示例的输出为:
我假设字符串中只有一个数字和一个单位。可以是2个月
或1天
,但不能是2个月1天
日、月和年的长度是不准确的估计,因为它们的实际长度不同。一个月可以是28到31天,一天可以是23到25小时
我使用以下小辅助方法将4h
转换为4h
,这是Duration.parse()所要求的:
如果是期间
(以天为基础而不是以时间为基础的间隔),我将迭代期间
支持的单位-年、月和日。对于每一个,我使用TemporalUnit.getDuration()
获取其估计的持续时间,并使用Period.get()
获取相应的值。调用mulitpliedBy()
(不要惊讶)将二者相乘。java.time.Duration
(用于小时)或java.time.Period
(用于日和月等民用时间度量)。这样的字符串究竟是什么样子?我希望一个月不会有两个n(就像你的问题文本中那样)。数值是直接连接到单位还是用额外的空格分隔?几个月的预期结果是什么?可能是28天、29天、30天或31天。好几天都是同一个问题?它们可能是23小时、24小时或25小时,甚至是介于这两者之间的一个值。TimeUnit
类可能会帮助您转换,但不幸的是,它无助于解析字符串。我相信,使用它可以为字符串构建解析器。不确定此时是否要开始使用Joda Time,因为它已经处于维护模式多年了。
4hours -> 14400000 milliseconds
1day -> 86400000 milliseconds
2months -> 5259492000 milliseconds
String unitToAbbreviation(String withFullUnit) {
return withFullUnit.replaceFirst("(\\d+[a-z])[a-z]*", "$1");
}