Cómo convertir HH: mm: ss.SSS a milisegundos?

Tengo un String 00:01:30.500 que es equivalente a 90500 milisegundos. Intenté usar SimpleDateFormat que proporciona milisegundos, incluida la fecha actual. Solo necesito esa representación de cadena a milisegundos. ¿Tengo que escribir un método personalizado, que se dividirá y calculará milisegundos? o ¿Hay alguna otra forma de hacer esto? Gracias.

Lo he intentado de la siguiente manera:

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

Puede usar SimpleDateFormat para hacerlo. Solo debes saber 2 cosas.

  1. Todas las fechas están representadas internamente en UTC
  2. .getTime() devuelve la cantidad de milisegundos desde 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()); } } 

Si quiere analizar el formato usted mismo, puede hacerlo fácilmente con una expresión regular como

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

Sin embargo, este análisis es bastante indulgente y aceptaría 99: 99: 99.999 y simplemente deja que los valores se desborden. Esto podría ser un inconveniente o una característica.

Si desea utilizar SimpleDateFormat , puede escribir:

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

Pero un método personalizado sería mucho más eficiente. SimpleDateFormat , debido a todo su soporte de calendario, soporte de zona horaria, soporte de horario de verano, etc., es bastante lento. La lentitud vale la pena si realmente necesita algunas de esas características, pero como no es así, podría no serlo. (Depende de la frecuencia con que llame a este método, y si la eficiencia es una preocupación para su aplicación).

Además, SimpleDateFormat no es seguro para subprocesos, lo que a veces es un problema. (Sin saber nada sobre su aplicación, no puedo adivinar si eso importa).

Personalmente, probablemente escribiría un método personalizado.

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