Почему при разборе Java отметка времени имеет префикс 0 в миллисекундной части? - PullRequest
2 голосов
/ 10 января 2020
final String OLD_FORMAT = "mm:ss.SS";        
final String TARGET_FORMAT = "HH:mm:ss,SSS";           

String timeInputStr="00:17.20";  // input is always in mm.ss.SS m--> minutes, ss-> seconds , and SSS is decimal fraction of seconds always , not actual milliseconds 
String timeOutputStr="";
Date d=new Date();
DateFormat  formatter= new SimpleDateFormat(OLD_FORMAT); 
DateFormat nformatter= new SimpleDateFormat(TARGET_FORMAT);          
try{   
        d = formatter.parse(timeInputStr);
}
catch (ParseException e){
         System.out.println("Can't Parse date "+d + " from: " +lrcTime );
}

timeInputStr=nformatter.format(d);
System.out.println( "For Input String: " + lrcTime +  " -> Parsed date "+ formatter.format(d) +  "-> will print as to  " + timeInputStr);
return timeOutputStr;   

Это дает мне следующий вывод:

For Input String: 00:17.20 -> Parsed date 00:17.20-> will print as to  00:00:17,020

Но я хочу разобрать такую ​​строку как 00:00:17,200

Чего мне не хватает?

Ответы [ 2 ]

6 голосов
/ 10 января 2020

Существует неоднозначность, которая улучшается в новых классах даты и времени:

Старый SimpleDateFormat

  • S = миллисекунда

    SS с 20 означает 20 мс, следовательно, SSS будет 020 мс.

Более новый DateTimeFormatter

  • S = доля секунды.

    Даст SSS = 200 мс

Обоснование новой интерпретации заключается в том, что с микросекундами и наносекундами 2 мсек, поскольку ,2 не совсем подходит для таких вещей, как ,SSSSSS - как вы заметили.

1 голос
/ 10 января 2020

Форматировщик интерпретирует .20 как 20 миллисекунд, а не 0,2 секунды (что будет 200 мс). Чтобы решить эту проблему, вы можете просто добавить ноль к вашей строке.

d = formatter.parse(lrcTime + "0");
...