如果这已经被讨论过,我很抱歉。
我在字符串中有一个剪辑持续时间:
00:10:17
我想以毫秒为单位将其转换为值。(上面的字符串基本上是617000)
是否有一些 API 可以通过一两个步骤来完成。基本方法是拆分字符串,然后添加分钟、秒和小时。
但是有没有更短的方法来做到这一点?
谢谢。
如果这已经被讨论过,我很抱歉。
我在字符串中有一个剪辑持续时间:
00:10:17
我想以毫秒为单位将其转换为值。(上面的字符串基本上是617000)
是否有一些 API 可以通过一两个步骤来完成。基本方法是拆分字符串,然后添加分钟、秒和小时。
但是有没有更短的方法来做到这一点?
谢谢。
这是一种自己编写的可能方法(始终假设相同的源格式)
String source = "00:10:17";
String[] tokens = source.split(":");
int secondsToMs = Integer.parseInt(tokens[2]) * 1000;
int minutesToMs = Integer.parseInt(tokens[1]) * 60000;
int hoursToMs = Integer.parseInt(tokens[0]) * 3600000;
long total = secondsToMs + minutesToMs + hoursToMs;
您可以简单地手动解析它:
String s = "00:10:17";
String[] data = s.split(":");
int hours = Integer.parseInt(data[0]);
int minutes = Integer.parseInt(data[1]);
int seconds = Integer.parseInt(data[2]);
int time = seconds + 60 * minutes + 3600 * hours;
System.out.println("time in millis = " + TimeUnit.MILLISECONDS.convert(time, TimeUnit.SECONDS));
持续时间是否包括小时或分钟或秒或没有都没有关系。
public static long durationToMillis(String duration) {
String[] parts = duration.split(":");
long result = 0;
for (int i = parts.length - 1, j = 1000; i >= 0; i--, j *= 60) {
try {
result += Integer.parseInt(parts[i]) * j;
} catch (NumberFormatException ignored) {
}
}
return result;
}
您可以使用java.time.Duration
它以ISO-8601 标准为模型,并作为JSR-310 实现的一部分与Java-8一起引入。
演示:
import java.time.Duration;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String strDuration = "00:10:17";
int[] parts = Arrays.stream(strDuration.split(":"))
.mapToInt(Integer::parseInt)
.toArray();
Duration duration = Duration.ZERO;
long millis = 0;
if (parts.length == 3) {
millis = duration.plusHours(parts[0])
.plusMinutes(parts[1])
.plusSeconds(parts[2])
.toMillis();
}
System.out.println(millis);
}
}
输出:
617000
注意:我使用Stream
APIString[]
将int[]
. 您可以在不使用Stream
API 的情况下执行此操作,如下所示:
String strDuration = "00:10:17";
String[] strParts = strDuration.split(":");
int[] parts = new int[strParts.length];
for (int i = 0; i < strParts.length; i++) {
parts[i] = Integer.parseInt(strParts[i]);
}
或者,您可以在将它们添加到时解析这些部分,Duration
如下所示:
import java.time.Duration;
public class Main {
public static void main(String[] args) {
String strDuration = "00:10:17";
String[] parts = strDuration.split(":");
Duration duration = Duration.ZERO;
long millis = 0;
if (parts.length == 3) {
millis = duration.plusHours(Integer.parseInt(parts[0]))
.plusMinutes(Integer.parseInt(parts[1]))
.plusSeconds(Integer.parseInt(parts[2]))
.toMillis();
}
System.out.println(millis);
}
}
输出:
617000
从Trail: Date Time了解现代日期时间 API 。
Java Stream
API 的一些很棒的教程:
创建一个适当的DateFormat
. 使用parse()
方法得到一个Date
. getTime()
在对象上使用Date
以获取毫秒。
你可以在这里查看。
我只是将其测试为:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class Test {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String inputString = "00:10:17";
Date date = sdf .parse(inputString);// .parse("1970-01-01" + inputString);
System.out.println("in milliseconds: " + date.getTime());
}
}
一个重复的问题(底部的链接)询问了一个没有秒的字符串HH:MM
,例如25:25
,使用 Java 7。我仍然推荐Duration
java.time 类,现代 Java 日期和时间 API。java.time 已被向后移植到 Java 6 和 7。有了它,有很多方法可以走。将 Basil Bourque 和 Live and Let Live 的一个很好的答案改编成一个字符串很简单,无需几秒钟。我正在展示一种方法。
String durationString = "25:25"; // HH:MM, so 25 hours 25 minutes
String isoDurationString
= durationString.replaceFirst("^(\\d+):(\\d{2})$", "PT$1H$2M");
long durationMilliseconds = Duration.parse(isoDurationString).toMillis();
System.out.format(Locale.US, "%,d milliseconds%n", durationMilliseconds);
在 Java 1.7.0_67 上运行时的输出:
91,500,000 毫秒
Duration.parse()
仅接受 ISO 8601 格式,例如PT25T25M
. 想想一段 25 小时 25 分钟的时间。因此,我使用正则表达式将您拥有的字符串转换为所需的格式。
这种方法的一个限制(与其他一些方法共有的限制)是验证效果不佳。我们希望拒绝大于 59 的分钟数,但Duration.parse()
接受它们。
是的,java.time 至少需要Java 1.6。
org.threeten.bp
子包中导入日期和时间类。LocalTime
,一个可以工作长达 23 小时 59 分钟的 hack,并且确实验证了分钟不超过 59。Duration
.java.time
第一次描述的地方。java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。