LocalDateTime以秒为单位

时间:2017-06-20 10:08:32

标签: java

我有一个格式为hh:mm:ss的字符串。这是电话的持续时间。

我想在几秒钟内获得该通话的持续时间。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);

如何从LocalDateTime获取持续时间?

5 个答案:

答案 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)

LocalDateTimeTemporal,这些代表了一个时间点,而不是持续时间。

虽然" 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以及LocalTimeLocalDateTime等。 - 有一些方法可以将Duration添加到一个时间来获得新的时间;从另一个中减去一个Temporal以获得Duration,依此类推。

{p> 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]);