2015-10-31 4 views
-3

У меня есть этот код из школы, и я не могу точно понять, что он делает. Я знаю, что это показывает время круга, например, спортивных состязаний, преобразованных за считанные минуты, секунды и миллисекунды, но я не понимаю, что такое 2 строковые переменные и что они делают.Код форматирования времени Lap запутан

Вот код:

public String getTimeFormat(long ms){ 
    String s1 = ""+ms; 
    Date date = null; 
    try { 
     date = new SimpleDateFormat("SSS").parse(s1); 
    } catch (ParseException e){ 
     e.printStackTrace(); 
    } 
    String s2 = new SimpleDateFormat("mm:ss:SS").format(date); 
    return s2; 
} 
+3

Попросите вашего учителя еще прочитать основы java – soorapadman

+0

Теперь самое подходящее время для вас, чтобы взять некоторые базовые учебники по java –

+0

Это не то место, где люди решают ваши домашние задания. – Alboz

ответ

5

Во-первых, это действительно плохой код на мой взгляд.

Это преобразование исходной ms значения в строку (так 35968 станет «35968»), а затем разбор, что в Date, как будто из формата, который только определяет количество миллисекунд ... который затем интерпретируется как «число миллисекунд с эпохи Unix в часовом поясе форматирования».

Затем оно преобразует значение Date в формате минут/секунд/миллисекунд, форматируя его другим SimpleDateFormat. Миллисекунды форматируются только до двух знаков после запятой, хотя в качестве разделителя здесь используется не :, а не .. (Это делает его похожим на часы/минуты/секунды, а не минуты/секунды/миллисекунды).

Оба формата используют тот же часовой пояс, который, по меньшей мере, , тип позволяет избежать проблем. Однако:

  • Если часовой пояс системы по умолчанию были переходы вокруг эпохи Unix, там еще может быть некоторые странности
  • Фундаментально это пытается форматировать длительность путем его обработки в качестве даты и времени. Это плохая идея
  • Исключение «обработка» смехотворно - если исключение при разборе, то первое исключение будет печататься и NullPointerException будет выброшен на следующую строке, как date еще будет нулевым
  • Если продолжительность составляет более часа, информация будет тихо потеряна; это не ясно, что желаемое поведение здесь
  • Даже если вы сделал хотите отформатировать его таким образом, было бы проще использовать new Date(ms), а затем отформатировать его с SimpleDateFormat с часовым поясом, установленным в UTC. Там нет необходимости для любой строки разбора здесь

Я не могу легко обеспечить лучший код, не зная еще несколько требований, но если вы пытаетесь заменить этот код вы должны рассмотреть следующие вопросы:

  • Учитывая, что у вас миллисекунды, вы определенно хотите только на десятки миллисекунд на дисплее?
  • Что вы хотите, если ms отрицательный?
  • Что вы хотите, если ms представляет собой больше часа?
  • Вы определенно хотите : как разделитель между секундами и миллисекундами?

Возможно, вы захотите использовать String.format для форматирования значения.К сожалению, ни Joda Time, ни java.time в Java 8 не имеют хорошего способа выполнения форматирования Duration, что вам действительно нужно.

+1

Хорошо, спасибо :) это смутило меня с датой, но теперь я понимаю! большое спасибо! –

+0

Я понял, что я конвертировал, поэтому я использовал новую дату (ms) и SimpleDateFormat, как вы предлагали, и она работает. Также изменил разделитель :) У меня не может быть отрицательных ms, потому что он уже определен как положительный и не более часа, к счастью :), но на самом деле большое спасибо за помощь !! –

+0

@LauraMoise: В этом случае я бы добавил тесты в начале метода, чтобы убедиться, что он * не * отрицательный, и что он * не * больше часа. Бросьте «IllegalArgumentException» в этих случаях. –

Смежные вопросы