在Java中将持续时间字符串转换为毫秒

时间:2013-03-14 13:23:46

标签: java duration

如果已经讨论过,我道歉。

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

00:10:17

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

我是否可以通过一步或两步来使用一些API。 基本的方法是拆分字符串,然后添加分钟,秒和小时。

但是有更短的方法吗?

感谢。

8 个答案:

答案 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

请参阅此code live in IdeOne.com

有关DurationLocalTime和java.time的更多说明,请参阅this Answer of minethis 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。

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

一些关于 Java Stream API 的精彩教程:

  1. Processing Data with Java SE 8 Streams, Part 1
  2. Part 2: Processing Data with Java SE 8 Streams
  3. Lesson: Aggregate Operations
  4. Reduction

答案 4 :(得分:0)

查看Joda Time Duration课程。

答案 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 1.7?

确实,java.time 至少需要 Java 1.6

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

链接

相关问题