关于java:如何将HH:mm:ss.SSS转换为毫秒?

How to convert HH:mm:ss.SSS to milliseconds?

我有一个String 00:01:30.500,相当于90500毫秒。 我尝试使用SimpleDateFormat,它提供毫秒,包括当前日期。 我只需要字符串表示毫秒。 我是否必须编写自定义方法,它将分割并计算毫秒数? 或者还有其他办法吗? 谢谢。

我试过如下:

1
2
3
4
        String startAfter ="00:01:30.555";
        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
        Date date = dateFormat.parse(startAfter);
        System.out.println(date.getTime());


您可以使用SimpleDateFormat来执行此操作。你只需要知道两件事。

  • 所有日期均在内部以UTC表示
  • .getTime()返回自1970-01-01 00:00:00 UTC以来的毫秒数。
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package se.wederbrand.milliseconds;

    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.TimeZone;

    public class Main {        
        public static void main(String[] args) throws Exception {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

            String inputString ="00:01:30.500";

            Date date = sdf.parse("1970-01-01" + inputString);
            System.out.println("in milliseconds:" + date.getTime());        
        }
    }


    如果您想自己解析格式,可以使用正则表达式轻松完成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private static Pattern pattern = Pattern.compile("(\\d{2}):(\\d{2}):(\\d{2}).(\\d{3})");

    public static long dateParseRegExp(String period) {
        Matcher matcher = pattern.matcher(period);
        if (matcher.matches()) {
            return Long.parseLong(matcher.group(1)) * 3600000L
                + Long.parseLong(matcher.group(2)) * 60000
                + Long.parseLong(matcher.group(3)) * 1000
                + Long.parseLong(matcher.group(4));
        } else {
            throw new IllegalArgumentException("Invalid format" + period);
        }
    }

    但是,这种解析非常宽松,可以接受99:99:99.999,只是让值溢出。这可能是一个缺点或特征。


    使用JODA:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PeriodFormatter periodFormat = new PeriodFormatterBuilder()
      .minimumParsedDigits(2)
      .appendHour() // 2 digits minimum
      .appendSeparator(":")
      .minimumParsedDigits(2)
      .appendMinute() // 2 digits minimum
      .appendSeparator(":")
      .minimumParsedDigits(2)
      .appendSecond()
      .appendSeparator(".")
      .appendMillis3Digit()
      .toFormatter();
    Period result = Period.parse(string, periodFormat);
    return result.toStandardDuration().getMillis();

    如果你想使用SimpleDateFormat,你可以写:

    1
    2
    3
    4
    5
    6
    private final SimpleDateFormat sdf =
        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        { sdf.setTimeZone(TimeZone.getTimeZone("GMT")); }

    private long parseTimeToMillis(final String time) throws ParseException
        { return sdf.parse("1970-01-01" + time).getTime(); }

    但是自定义方法会更有效率。 SimpleDateFormat,由于其所有日历支持,时区支持,夏令时支持等等,都非常缓慢。如果你真的需要一些这些功能,那么它的速度是值得的,但是既然你没有,那可能就不行了。 (这取决于您调用此方法的频率,以及效率是否与您的应用程序有关。)

    此外,SimpleDateFormat是非线程安全的,这有时是一种痛苦。 (不知道你的申请是什么,我无法猜测是否重要。)

    就个人而言,我可能会写一个自定义方法。