我如何将这次:“9:7.110”转换为“09:07.110”?

How can I convert this time : "9:7.110" to "09:07.110"?

我的程序获取两个时间值并相减。

有时减法后的结果可能是这样的(分:秒.毫秒):

9:7.110

但我希望我的程序打印另一个(如果分钟、秒或毫秒只包含一个数字,则在该数字之前打印零:

09:07.110

也许是这样的格式:

DateTimeFormatter formatterForResultedPrinting = DateTimeFormatter.ofPattern("mm:ss.SSS");

我这次收藏了:

9:7.110

在字符串中。

首先 parsem:s.SSS,然后 formatmm.ss.SSS:

String in = "9:7.110";
String out = DateTimeFormatter.ofPattern("mm:ss.SSS").format(DateTimeFormatter.ofPattern("m:s.SSS").parse(in));

你得到了一个String,你想要的输出也是一个String。为什么不使用如下所示的简单 String 函数创建自己的函数?

public class Main {

    public static void main(String[] args) {
        try {
            System.out.println(convert("09:07.110"));
            System.out.println(convert("9:07.110"));
            System.out.println(convert("09:7.1"));
            System.out.println(convert("9:07.11"));
            System.out.println(convert("9:7a.110"));
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    static String convert(String str) throws IllegalArgumentException {
        String mm = str.substring(0, str.indexOf(":"));
        String ss = str.substring(str.indexOf(":") + 1, str.indexOf("."));
        String mil = str.substring(str.indexOf(".") + 1);
        if (mm.length() == 0 || mm.length() > 2 || ss.length() == 0 || ss.length() > 2 || mil.length() == 0
                || mil.length() > 3 || !mm.matches("[0-9]+") || !ss.matches("[0-9]+") || !mil.matches("[0-9]+")) {
            throw new IllegalArgumentException("Invalid time string");
        }
        mm = mm.length() == 1 ? "0" + mm : mm;
        ss = ss.length() == 1 ? "0" + ss : ss;
        mil = mil.length() == 1 ? "00" + mil : (mil.length() == 2 ? "0" + mil : mil);
        return mm + ":" + ss + "." + mil;
    }
}

输出:

09:07.110
09:07.110
09:07.001
09:07.011
Invalid time string

持续时间从 java.time

对于以小时、分钟、秒为单位的时间量 and/or 秒的分数使用 Duration class.

    String differenceString = "9:7.110";

    String differenceIsoString = differenceString
            .replaceFirst("^(\d{1,2}):(\d{1,2}.\d{3})$", "PTMS");
    Duration difference = Duration.parse(differenceIsoString);

    String diffStringWithZeroes
            = String.format("%02d:%02d.%03d", difference.toMinutes(),
                    difference.toSecondsPart(), difference.toMillisPart());
    System.out.println("Difference: " + diffStringWithZeroes);

这给出了您要求的输出:

Difference: 09:07.110

Duration.parse() 解析 ISO 8601 格式的时间量。看起来像 PT9M7.110S。读作 9 分 7.110 秒 的时间段。因此,我们首先使用正则表达式将您的字符串转换为这种格式。为了将持续时间格式化回更易于阅读的格式,我们使用 String.format().

链接