我有一个格式为hh:mm:ss
的字符串。这是电话的持续时间。
我想在几秒钟内获得该通话的持续时间。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
如何从LocalDateTime获取持续时间?
答案 0 :(得分:9)
没有日期组件,因此您只需使用LocalTime
,但 LocalTime
并非真正用于表示持续时间 :
String input = "01:52:27";
LocalTime time = LocalTime.parse(input);
int seconds = time.toSecondOfDay();
请注意,这仅适用于最长23:59:59
的持续时间。
更好的方法是使用Duration
类 - 请注意,它还可以应对更长的持续时间:
//convert first to a valid Duration representation
String durationStr = input.replaceAll("(\\d+):(\\d+):(\\d+)", "PT$1H$2M$3S");
Duration duration = Duration.parse(durationStr);
int seconds = duration.getSeconds();
答案 1 :(得分:3)
没有必要将其转换为LocalDateTime
,我们可以直接从字符串中获取秒数。
尝试用冒号拆分,然后获取最后一个元素。
或者,如果您正在寻找总秒,请相应地将每个部分相乘:
String time = "10:15:34";
String[] sections = time.split(":");
int seconds = Integer.parseInt(sections[2]);
int totalSeconds =
(Integer.parseInt(sections[0]) * 60 * 60) +
(Integer.parseInt(sections[1]) * 60) +
(Integer.parseInt(sections[2]));
System.out.println("Seconds: " + seconds);
System.out.println("Total seconds: " + totalSeconds);
答案 2 :(得分:2)
不确定是否有内置内容,但以下内容应该可以完成:
private long getSecondDuration(LocalDateTime t) {
long h = t.getHour();
long m = t.getMinute();
long s = t.getSecond();
return (h * 3600) + (m * 60) + s;
}
答案 3 :(得分:2)
我会从Pattern
开始,测试String
是否匹配正则表达式模式(如冒号分隔的三组数字)并构建Duration
,类似
Pattern p = Pattern.compile("(\\d+):(\\d+):(\\d+)");
Matcher m = p.matcher(timeStr);
if (m.matches()) {
int hours = Integer.parseInt(m.group(1));
int minutes = Integer.parseInt(m.group(2));
int seconds = Integer.parseInt(m.group(3));
Duration d = Duration.ofHours(hours).plusMinutes(minutes).plusSeconds(seconds);
System.out.println(d.getSeconds());
}
答案 4 :(得分:2)
LocalDateTime
是Temporal
,这些代表了一个时间点,而不是持续时间。
虽然" 1:30:00"可以被解释为一个点和一个持续时间,语义是不同的。
这一点很重要的一个原因是" 25:30:02"是有效的持续时间,但不是有效的时间。
Java 8有一个java.time.Duration
类。
如果你可以依赖你的输入字符串是有效的,那么很容易将它们分开:
String[] parts = durationAsString.split(":");
Duration duration = Duration
.ofHours(Long.parseLong(parts[0]))
.plusMinutes(Long.parseLong(parts[1]))
.plusSeconds(Long.parseLong(parts[2]));
(如果您不能依赖输入有效,可以使用正则表达式进行预验证,也可以添加代码来处理parts.length != 3
并解析来自parseLong
的异常)
检查Duration
的Javadoc以了解您可以用它做什么。一种方法是getSeconds()
,它以秒为单位给出总持续时间。
您还可以使用Duration
以及LocalTime
,LocalDateTime
等。 - 有一些方法可以将Duration
添加到一个时间来获得新的时间;从另一个中减去一个Temporal
以获得Duration
,依此类推。
Duration
可能比你需要的更复杂。如果你真的需要转换" 01:30:10"几秒钟,自己做数学没有错:
String[] parts = durationAsString.split(":");
long seconds =
Long.parseLong(parts[0]) * 60 * 60 +
Long.parseLong(parts[1]) * 60 +
Long.parseLong(parts[2]);