Java LocalDateTime(秒)

Java LocalDateTime(秒),java,Java,我有一个格式为hh:mm:ss的字符串。这是一个电话的持续时间 我想在几秒钟内得到那个电话的持续时间 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss"); LocalDateTime time = LocalDateTime.parse(timeStr, formatter); 如何从LocalDateTime获取以秒为单位的持续时间?不确定是否有内置内容,但以下内容应该可以完成此工作: private l

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

我想在几秒钟内得到那个电话的持续时间

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

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

不确定是否有内置内容,但以下内容应该可以完成此工作:

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(第[2]节);
整数总秒=
(Integer.parseInt(节[0])*60*60)+
(Integer.parseInt(第[1]节)60)+
(Integer.parseInt(第[2]节));
System.out.println(“秒:+秒);
System.out.println(“总秒数:+totalSeconds”);

没有日期组件,因此您可以简单地使用
LocalTime
,尽管
LocalTime
并不是真正用来表示持续时间的:

String input = "01:52:27";
LocalTime time = LocalTime.parse(input);
int seconds = time.toSecondOfDay();
请注意,这仅适用于
23:59:59
之前的持续时间


更好的方法是使用
持续时间
——请注意,它还可以处理更长的持续时间:

//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();
我将从一个开始,测试
字符串是否匹配正则表达式模式(如三组由冒号分隔的数字),然后构建一个

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”是一个有效的持续时间,但不是一天中的有效时间

Java8有一个
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的
持续时间
,看看你能用它做些什么。一种方法是
getSeconds()
,它提供以秒为单位的总持续时间

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
您还可以使用
持续时间
以及
本地时间
本地日期时间
等-有一些方法可以将
持续时间
添加到时间中以获取新时间;将一个
时间
与另一个相减,得到
持续时间
,依此类推

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

不要从中生成LocalDateTime对象。它的工作原理和baaos的答案一样,但这是一个非常奇怪的思路,因为你谈论的是一个持续时间,你把它放在一个对象中,这个对象应该在某一天、某个月、某一年的某个固定时间。assylas向您展示了一种更好的方法,尽管该方法仍然被称为“toSecondOfDay()”,这可能会导致试图阅读您的代码的人感到困惑。这就是为什么我会选择Okx方式。不要使用设计用于表示一个时刻、表示一个持续时间的类型。一部电影的长度是一个半小时,而不是凌晨一点半。我同意这一点,并建议采用
时长
的方法。为了澄清这一点,我进行了编辑。