当前位置: 首页 > 面试题库 >

将持续时间字符串解析为毫秒

能钟展
2023-03-14
问题内容

我需要将持续时间字符串解析98d 01h 23m 45s为毫秒形式。

我希望SimpleDateFormat像这样的持续时间相等,但是我什么也找不到。有人会建议为此目的使用或支持SDF吗?

我目前的计划是使用正则表达式来匹配数字并做类似的事情

Pattern p = Pattern.compile("(\\d+)");
Matcher m = p.matcher("98d 01h 23m 45s");

if (m.find()) {
    int days = Integer.parseInt(m.group());
}
// etc. for hours, minutes, seconds

然后使用TimeUnit将它们放在一起并转换为毫秒。

我想我的问题是,这似乎有点过头了,它可以轻松完成吗?出现了很多有关日期和时间戳的问题,但这也许有些不同。


问题答案:

使用a Pattern是一种合理的方法。但是,为什么不使用单个字段来获取所有四个字段呢?

Pattern p = Pattern.compile("(\\d+)d\\s+(\\d+)h\\s+(\\d+)m\\s+(\\d+)s");

然后使用索引组提取。

编辑:

基于您的想法,我最终编写了以下方法

private static Pattern p = Pattern
        .compile("(\\d+)d\\s+(\\d+)h\\s+(\\d+)m\\s+(\\d+)s");

/**
 * Parses a duration string of the form "98d 01h 23m 45s" into milliseconds.
 * 
 * @throws ParseException
 */
public static long parseDuration(String duration) throws ParseException {
    Matcher m = p.matcher(duration);

    long milliseconds = 0;

    if (m.find() && m.groupCount() == 4) {
        int days = Integer.parseInt(m.group(1));
        milliseconds += TimeUnit.MILLISECONDS.convert(days, TimeUnit.DAYS);
        int hours = Integer.parseInt(m.group(2));
        milliseconds += TimeUnit.MILLISECONDS
                .convert(hours, TimeUnit.HOURS);
        int minutes = Integer.parseInt(m.group(3));
        milliseconds += TimeUnit.MILLISECONDS.convert(minutes,
                TimeUnit.MINUTES);
        int seconds = Integer.parseInt(m.group(4));
        milliseconds += TimeUnit.MILLISECONDS.convert(seconds,
                TimeUnit.SECONDS);
    } else {
        throw new ParseException("Cannot parse duration " + duration, 0);
    }

    return milliseconds;
}


 类似资料:
  • 我想将任何持续时间/周期字符串文字(以下面示例中显示的格式)解析为Java中的周期/持续时间实例。 所谓持续时间/周期,我指的是包含基于日期和基于时间的数量的时间量。在Java中,仅适用于基于时间的量,如秒、分钟和小时,而,仅适用于日期量,如年、月和日。 要解析的字符串并不总是包含所有量。 例子: < li> < li> < li> < li> 如果可能的话,我会怎么做?

  • 问题内容: 我遇到了将“星期几”字符串转换为值的问题。我找不到包中内置的任何内容。 然后,我编写了这个简单的函数(满足了我的需求): 还有其他 建议 或 更惯用的 方式在Golang中执行此转换吗? 谢谢! 问题答案: 前言: 我在中发布了此实用程序,请参见。 是的,使用映射而不是数组,因此查找更快,更简单: 测试它: 输出(在Go Playgorund上尝试): 小费: 您甚至可以使用循环来安全

  • 我有一个字符串时间格式。我没有找到任何格式来解析这个字符串值。有没有办法将这个字符串值转换为Gotime.Time? 编辑 - 这不是重复的问题。我知道如何解析,但我不知道我们可以使用时间格式包中列出的任何布局。这个答案清除了我的涂鸦。

  • 基本上,我使用下面的代码将string解析为LocalDateTime,这在大多数情况下都很好。 然而,我遇到过秒数和毫秒数的情况,这是解析器失败并打印而不是的情况。 (注意,在我的代码中,我必须将字符串解析为< code>LocalDateTime,进行一些比较,然后在最后将< code>LocalDateTime打印为csv) 如何修复它以使其打印而不是? 仅供参考,我正在使用jdk10。

  • 在ISO 8601中,持续时间的格式为<code>P[n]Y[n]M[n]DT[n]H[n]M[n]S。 例子: 20秒: 一年两个月三天四小时五分钟六秒: 问题: 给定一个包含iso 8601格式的持续时间的字符串。我想获得这段时间的总秒数。标准C 11中推荐的实现方式是什么? 备注: 例如,boost DateTime中有ptime from _ iso _ string(STD::strin

  • 问题内容: 基本上,我使用下面的代码将字符串解析为LocalDateTime,在大多数情况下都可以正常工作。 但是,我遇到的情况是秒和毫秒00000,这是解析器失败并打印LocalDateTime 2018-03-01T09:16而不是的情况2018-03-01T09:16:00.000。 (请注意,在我的代码中,我必须将string解析为LocalDateTime,进行一些比较,然后最后输出Lo