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

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

我试过如下:

  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来执行此操作。 你只需知道两件事。

  1. 所有日期均在内部以UTC表示
  2. .getTime()返回自1970-01-01 00:00:00 UTC以来的毫秒数。
 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()); } } 

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

 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,只是让值溢出。 这可能是一个缺点或特征。

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

 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 ,因为它的所有日历支持,时区支持,夏令时支持等等,都非常缓慢。 如果您确实需要其中一些function,那么速度是值得的,但是既然您没有,那么它可能不会。 (这取决于您调用此方法的频率,以及效率是否适合您的应用程序。)

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

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

使用JODA :

 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();