4

如果这已经被讨论过,我很抱歉。

我在字符串中有一个剪辑持续时间:

00:10:17

我想以毫秒为单位将其转换为值。(上面的字符串基本上是617000)

是否有一些 API 可以通过一两个步骤来完成。基本方法是拆分字符串,然后添加分钟、秒和小时。

但是有没有更短的方法来做到这一点?

谢谢。

4

8 回答 8

10

这是一种自己编写的可能方法(始终假设相同的源格式)

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;
于 2013-03-14T13:29:28.243 回答
9

您可以简单地手动解析它:

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));
于 2013-03-14T13:29:02.713 回答
8

java.time.Duration

使用Duration类。

Duration.between( 
    LocalTime.MIN , 
    LocalTime.parse( "00:10:17" ) 
).toMillis()

毫秒:617000

在 IdeOne.com 中查看此代码。

有关、 和 java.time的更多解释,请参阅我的这个答案和我对类似问题的这个答案DurationLocalTime

警告:从java.time 对象中的可能值 nanoseconds 转换为所需的 milliseconds 时,请注意可能的数据丢失

于 2017-01-03T22:36:19.960 回答
1

持续时间是否包括小时或分钟或秒或没有都没有关系。

  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;
}
于 2020-11-02T16:34:15.053 回答
1

您可以使用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

注意:我使用StreamAPIString[]int[]. 您可以在不使用StreamAPI 的情况下执行此操作,如下所示:

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 。

  1. 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。
  2. 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring和How to use ThreeTenABP in Android Project检查Java 8+ APIs available

Java StreamAPI 的一些很棒的教程:

  1. 使用 Java SE 8 流处理数据,第 1 部分
  2. 第 2 部分:使用 Java SE 8 流处理数据
  3. 课程:聚合操作
  4. 减少
于 2021-01-19T15:38:15.003 回答
0

查看Joda Time Duration课程。

于 2013-03-14T13:26:46.363 回答
0

创建一个适当的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());        
    }
}
于 2013-03-14T13:28:03.790 回答
0

一个重复的问题(底部的链接)询问了一个没有秒的字符串HH:MM,例如25:25,使用 Java 7。我仍然推荐Durationjava.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 1.7 上运行?

是的,java.time 至少需要Java 1.6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上,要么使用脱糖,要么使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保您从org.threeten.bp子包中导入日期和时间类。

链接

于 2021-01-21T05:12:28.413 回答