如果已经讨论过,我道歉。
我在字符串中有一个剪辑持续时间:
00:10:17
我想将其转换为以毫秒为单位的值。 (上述字符串基本上为617000)
我是否可以通过一步或两步来使用一些API。 基本的方法是拆分字符串,然后添加分钟,秒和小时。
但是有更短的方法吗?
感谢。
答案 0 :(得分:8)
您可以手动解析它:
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));
答案 1 :(得分:3)
这是一种自己编写的可能方法(始终假设相同的源格式)
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;
答案 2 :(得分:2)
java.time.Duration
使用Duration
类。
Duration.between(
LocalTime.MIN ,
LocalTime.parse( "00:10:17" )
).toMillis()
毫秒:617000
有关Duration
,LocalTime
和java.time的更多说明,请参阅this Answer of mine和this Answer of mine类似的问题。
警告:在将java.time对象中的nanoseconds的可能值转换为所需的milliseconds时,请注意可能的数据丢失。
答案 3 :(得分:1)
您可以使用 java.time.Duration
,它以 ISO-8601 standards 为模型,并作为 JSR-310 implementation 的一部分与 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
API 将 String[]
转换为 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 的精彩教程:
答案 4 :(得分:0)
答案 5 :(得分:0)
创建DateFormat
的适当实例。使用parse()
方法获取Date
。在getTime()
对象上使用Date
可以获得毫秒数。
您可以查看here。
我刚试过它:
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());
}
}
答案 6 :(得分:0)
持续时间是否包含小时或分钟或秒或无。
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;
}
答案 7 :(得分:0)
一个重复的问题(底部链接)询问一个没有秒的字符串,只是 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 分钟的黑客,并且确实验证了分钟不超过 59。Duration
。java.time
。java.time
向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。