我有一个格式为hh:mm:ss
的字符串。这是一个电话的时间。LocalDateTime在几秒钟内
我想在几秒钟内获得该通话的持续时间。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
如何从LocalDateTime获得以秒为单位的持续时间?
我有一个格式为hh:mm:ss
的字符串。这是一个电话的时间。LocalDateTime在几秒钟内
我想在几秒钟内获得该通话的持续时间。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
如何从LocalDateTime获得以秒为单位的持续时间?
没有日期部分,所以你可以简单地使用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();
不知道是否有什么东西在建,但下面应该做的工作:
private long getSecondDuration(LocalDateTime t) {
long h = t.getHour();
long m = t.getMinute();
long s = t.getSecond();
return (h * 3600) + (m * 60) + s;
}
没有必要将其转换为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);
我将开始与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());
}
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
的异常)
检查Javadoc的Duration
以了解您可以使用它做什么。一种方法是getSeconds()
它给你的总持续时间以秒为单位。
你也可以使用一个Duration
随着LocalTime
,LocalDateTime
等等 - 有方法的Duration
添加到时间来获得一个新的时间;从另一个Temporal
中减去一个Duration
等等。
有可能Duration
比您需要更复杂。如果你真的只需要转换“1时30分十秒”到秒,有什么不对自己做的数学:
String[] parts = durationAsString.split(":");
long seconds =
Long.parseLong(parts[0]) * 60 * 60 +
Long.parseLong(parts[1]) * 60 +
Long.parseLong(parts[2]);
不要让一个LocalDateTime对象出来。它会像baaos的回答一样工作,但这是一种非常奇怪的思路,因为你正在谈论一个持续时间,并将它放入一个应该在特定的日,月和年保持固定时间的对象。尽管该方法仍被称为“toSecondOfDay()”,但它可能会让试图阅读您的代码的人感到困惑,但assylas向您展示了一种更好的方式。这就是为什么我会采取Okx的方式。 – Mark