Java 这一次我怎样才能转换成:;9:7.110“;至;09:07.110;?

Java 这一次我怎样才能转换成:;9:7.110“;至;09:07.110;?,java,time,time-format,Java,Time,Time Format,我的程序得到两个时间值并减去它 减法后,有时结果可能如下(分:秒。毫秒): 但我希望我的程序打印另一个数字(如果分、秒或毫秒仅包含一个数字,则在该数字之前打印零的数字: 09:07.110 也许是这样的形式: DateTimeFormatter formatterForResultedPrinting = DateTimeFormatter.ofPattern("mm:ss.SSS"); 我这次存储: 9:7.110 在字符串中。首先用m:s.SSS解析,然后用mm.ss.SSS格式化:

我的程序得到两个时间值并减去它

减法后,有时结果可能如下(分:秒。毫秒):

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

09:07.110
也许是这样的形式:

DateTimeFormatter formatterForResultedPrinting = DateTimeFormatter.ofPattern("mm:ss.SSS");
我这次存储:

9:7.110
在字符串中。

首先用
m:s.SSS
解析,然后用
mm.ss.SSS
格式化:

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

您有一个
字符串
,您想要的输出也是一个
字符串
。为什么不使用如下所示的简单
字符串
函数创建您自己的函数

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的持续时间 对于以小时、分钟、秒和/或秒分数为单位的时间量,请使用
持续时间
课程

    String differenceString = "9:7.110";

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

    String diffStringWithZeroes
            = String.format("%02d:%02d.%03d", difference.toMinutes(),
                    difference.toSecondsPart(), difference.toMillisPart());
    System.out.println("Difference: " + diffStringWithZeroes);
这将提供您要求的输出:

差价:09:07.110

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

链接
  • 解释如何使用java.time

你从哪里得到
9:7.110
这是一种完全不正确的格式。如果毫秒只有两位数呢?如果是一位数呢?@ElliottFrisch应该在必要的毫秒位数之前是一到两个零,就像秒和分钟一样。我假设输入中小数点后总是有三位数?(将12:34.5理解为12分34秒5毫秒,并将其格式化为12:34.005是没有任何意义的。)代码给出了所需的输出。如果时间是一天中的某个时间(00:09:07.11 AM),则您的方法是正确的。但是
DateTimeFormatter
不适用于持续时间和时间量。
    String differenceString = "9:7.110";

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

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