在Java中将HumanReadable时间解析为毫秒

在Java中将HumanReadable时间解析为毫秒,java,Java,我正在尝试将一个字符串(如4小时、1天或2个月)转换为毫秒。但是,我如何在不必检查string.contains(“h”)等的情况下有效地执行此操作呢 Node有,Java会有类似的东西吗 根据一些回答进行编辑:是的,实际数字可以更改,我给出了4个小时作为示例,但可以是1、2、3、5等。天数和月份相同。是的,它们彼此紧挨着。没有空间。 示例字符串:提醒学生上学 输出应该是:360000(毫秒)好吧,你可以把它分解成更小的部分 在字符串中查找此类事件 取数字部分和单位部分,乘以它们的值,得到毫秒

我正在尝试将一个字符串(如4小时、1天或2个月)转换为毫秒。但是,我如何在不必检查string.contains(“h”)等的情况下有效地执行此操作呢

Node有,Java会有类似的东西吗

根据一些回答进行编辑:是的,实际数字可以更改,我给出了4个小时作为示例,但可以是1、2、3、5等。天数和月份相同。是的,它们彼此紧挨着。没有空间。 示例字符串:提醒学生上学
输出应该是: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");
}