2017-06-20 141 views
0

我有一个格式为hh:mm:ss的字符串。这是一个电话的时间。LocalDateTime在几秒钟内

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

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

如何从LocalDateTime获得以秒为单位的持续时间?

+0

不要让一个LocalDateTime对象出来。它会像baaos的回答一样工作,但这是一种非常奇怪的思路,因为你正在谈论一个持续时间,并将它放入一个应该在特定的日,月和年保持固定时间的对象。尽管该方法仍被称为“toSecondOfDay()”,但它可能会让试图阅读您的代码的人感到困惑,但assylas向您展示了一种更好的方式。这就是为什么我会采取Okx的方式。 – Mark

回答

7

没有日期部分,所以你可以简单地使用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(); 
+0

请勿使用旨在表示片刻的类型来表示持续时间。一部电影的长度是一个半小时,而不是一个半小时。 – slim

+0

我同意这一点,并会推荐“持续时间”方法。我已经编辑来澄清这一点。 – assylias

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

没有必要将其转换为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

我将开始与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()); 
} 
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的异常)

检查Javadoc的Duration以了解您可以使用它做什么。一种方法是getSeconds()它给你的总持续时间以秒为单位。

你也可以使用一个Duration随着LocalTimeLocalDateTime等等 - 有方法的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]);