Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“我想转换”;08:30:00“;进入P00DT08H30M。在java中转换为所需输出的最佳方式是什么?_Java_Date_Formatter - Fatal编程技术网

“我想转换”;08:30:00“;进入P00DT08H30M。在java中转换为所需输出的最佳方式是什么?

“我想转换”;08:30:00“;进入P00DT08H30M。在java中转换为所需输出的最佳方式是什么?,java,date,formatter,Java,Date,Formatter,我想将“08:30:00”转换为P00DT08H30M。在java中转换为所需输出的最佳方式是什么?如果是文本,您可以执行以下操作: 字符串输出=“P00DT”+测试子字符串(0,2)+“H”+测试子字符串(3,5)+“M” 如果是文本,您可以执行以下操作: 字符串输出=“P00DT”+测试子字符串(0,2)+“H”+测试子字符串(3,5)+“M” 不清楚你到底在问什么。是时间戳吗?那么D部分应该是00 无论如何,您可以使用这样的正则表达式: "08:30:00".replaceFirs

我想将“08:30:00”转换为P00DT08H30M。在java中转换为所需输出的最佳方式是什么?

如果是文本,您可以执行以下操作:


字符串输出=“P00DT”+测试子字符串(0,2)+“H”+测试子字符串(3,5)+“M”

如果是文本,您可以执行以下操作:


字符串输出=“P00DT”+测试子字符串(0,2)+“H”+测试子字符串(3,5)+“M”

不清楚你到底在问什么。是时间戳吗?那么D部分应该是00

无论如何,您可以使用这样的正则表达式:

    "08:30:00".replaceFirst("(\\d\\d):(\\d\\d):(\\d\\d)", "P00DT$1H$2M")

不清楚你到底在问什么。是时间戳吗?那么D部分应该是00

无论如何,您可以使用这样的正则表达式:

    "08:30:00".replaceFirst("(\\d\\d):(\\d\\d):(\\d\\d)", "P00DT$1H$2M")

P00DT08H30M
是最新版本。它表示经过的时间跨度,在本例中为“8小时30分钟”

请注意,这不是一天中的某个时间,与“上午8:30”不同。一天中的某个时间代表一天中的某个特定时刻:08:30(上午或下午)是一个特定时刻。而持续时间(8小时30分钟)表示经过的时间跨度,无论它在何时开始或结束

可能让人困惑的是,两者使用相同的词(“分钟”、“秒”等),甚至可以用相同的方式表示(“我在上午8:30开会”或“活动持续时间为上午8:30,但它们是不同的概念。”

不管怎样,一种解决方案是使用大量的
子字符串
并结合级联,正如其他答案所建议的那样。但您也可以使用类:在Java8中,它们是打包的,在旧版本中,您可以在库中找到它们

在这两种情况下,都有一些替代方案:

您可以拆分字符串并使用这些部分构建持续时间:

String s = "08:30:00";
String[] parts = s.split(":");

Duration duration = Duration.ofHours(Long.parseLong(parts[0]))
    .plusMinutes(Long.parseLong(parts[1]))
    .plusSeconds(Long.parseLong(parts[2]));
String output = duration.toString();
或者,您可以使用(概念上不正确的)方法,假装输入是一天中的某个时间,并计算该时间与午夜之间的差值:

LocalTime time = LocalTime.parse("08:30:00");

Duration duration = Duration.between(LocalTime.MIDNIGHT, time);
String output = duration.toString();
但是请注意,
duration.toString()
方法忽略了所有为零的字段,输出将是
PT8H30M
。但您可以通过使用简单的替换来克服此问题:

System.out.println(output.replace("PT", "P00DT"));
这张照片是:

P00DT8H30M

还要注意的是,“8”没有用零填充(它没有打印为“08”)。不确定这对你是否有影响


第二种方法只有在有时间字段(小时、分钟和秒)时才“有效”。对于您在评论中提到的另一个案例:

如果值为“2:00:30:00”,则输出应类似于P02DT00H30M

那么最好使用第一种方法。也许您可以检查输入有多少部分,并相应地设置字段。但是
Duration
类将天转换为小时,因此要获得所需的输出,需要项目及其类:


但是,所有值为零的字段都将被复制,因此需要对输出进行后处理。但我认为打印所有的零字段是多余的,除非这是您的系统必须具备的要求。

P00DT08H30M
是最重要的。它表示经过的时间跨度,在本例中为“8小时30分钟”

请注意,这不是一天中的某个时间,与“上午8:30”不同。一天中的某个时间代表一天中的某个特定时刻:08:30(上午或下午)是一个特定时刻。而持续时间(8小时30分钟)表示经过的时间跨度,无论它在何时开始或结束

可能让人困惑的是,两者使用相同的词(“分钟”、“秒”等),甚至可以用相同的方式表示(“我在上午8:30开会”或“活动持续时间为上午8:30,但它们是不同的概念。”

不管怎样,一种解决方案是使用大量的
子字符串
并结合级联,正如其他答案所建议的那样。但您也可以使用类:在Java8中,它们是打包的,在旧版本中,您可以在库中找到它们

在这两种情况下,都有一些替代方案:

您可以拆分字符串并使用这些部分构建持续时间:

String s = "08:30:00";
String[] parts = s.split(":");

Duration duration = Duration.ofHours(Long.parseLong(parts[0]))
    .plusMinutes(Long.parseLong(parts[1]))
    .plusSeconds(Long.parseLong(parts[2]));
String output = duration.toString();
或者,您可以使用(概念上不正确的)方法,假装输入是一天中的某个时间,并计算该时间与午夜之间的差值:

LocalTime time = LocalTime.parse("08:30:00");

Duration duration = Duration.between(LocalTime.MIDNIGHT, time);
String output = duration.toString();
但是请注意,
duration.toString()
方法忽略了所有为零的字段,输出将是
PT8H30M
。但您可以通过使用简单的替换来克服此问题:

System.out.println(output.replace("PT", "P00DT"));
这张照片是:

P00DT8H30M

还要注意的是,“8”没有用零填充(它没有打印为“08”)。不确定这对你是否有影响


第二种方法只有在有时间字段(小时、分钟和秒)时才“有效”。对于您在评论中提到的另一个案例:

如果值为“2:00:30:00”,则输出应类似于P02DT00H30M

那么最好使用第一种方法。也许您可以检查输入有多少部分,并相应地设置字段。但是
Duration
类将天转换为小时,因此要获得所需的输出,需要项目及其类:


但是,所有值为零的字段都将被复制,因此需要对输出进行后处理。但是我认为打印所有的零字段是多余的,除非这是您的系统必须具备的要求。

由于您想要的结果,
P00DT08H30M
,在一段时间内符合ISO 8601格式,我假设您的
08:30:00
就是:一段时间,一段时间。8小时30分钟(0秒)

有许多选择,每个都有其优缺点。我想我会选择这个:

    String durationString = "08:30:00";
    Pattern durationPattern = Pattern.compile("(\\d{2,}):([0-5]\\d):([0-5]\\d)");
    Matcher m = durationPattern.matcher(durationString);
    if (m.matches()) {
        Duration dur = Duration.ofHours(Long.parseLong(m.group(1)))
                .plusMinutes(Long.parseLong(m.group(2)))
                .plusSeconds(Long.parseLong(m.group(3)));

        System.out.println(dur);
    }
输出:

PT8
    LocalTime time = LocalTime.parse(durationString);
    Duration dur = Duration.between(LocalTime.MIN, time);
    String formattedDuration = String.format(Locale.ROOT, "P%02dDT%02dH%02dM",
            dur.toDays(), dur.toHoursPart(), dur.toMinutesPart());
    System.out.println(formattedDuration);
String d1 = "08:30:00";
String d2 = "2:00:30:00";

Duration.Formatter<IsoUnit> parser = Duration.formatter("[#D:]hh:mm:ss");
Duration.Formatter<IsoUnit> printer = Duration.formatter("'P'DD'DT'hh'H'mm'M'");

System.out.println(printer.format(parser.parse(d1))); // P00DT08H30M
System.out.println(printer.format(parser.parse(d2))); // P02DT00H30M