“我想转换”;08:30:00“;进入P00DT08H30M。在java中转换为所需输出的最佳方式是什么?
我想将“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
字符串输出=“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