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方式。不要使用设计用于表示一个时刻、表示一个持续时间的类型。一部电影的长度是一个半小时,而不是凌晨一点半。我同意这一点,并建议采用时长
的方法。为了澄清这一点,我进行了编辑。