Преобразование формата времени строки ЧЧ: ММ: СС (AM / PM) в секунды - PullRequest
0 голосов
/ 20 февраля 2019

Итак, у меня есть это задание, в котором нас просят принять строковый формат времени в порядке ЧЧ: ММ: ССАМ или ЧЧ: СС: ММРМ.Ограничение состоит в том, что он не может работать, если он находится в неправильном формате, пусть он пропускает любую форму AM или PM, пропускает число или если он в 24-часовом формате.

У меня есть вся идеявниз, однако, для моих утверждений, это дает мне ошибку:

неверные типы операндов для несопоставимых типов двоичного оператора '>': String и int

Я неправильно преобразовал их или яделать что-то еще не так?

public static void main(String args[]) {
    //Test Methods
  String fullTime1 = "03:21:36AM";
  secondsAfterMidnight(fullTime1);
}


public static int secondsAfterMidnight(String time) {
  String[] units = time.split(":");
  int hours = Integer.parseInt(units[0]);
  int minutes = Integer.parseInt(units[1]);
  int seconds = Integer.parseInt(units[2]);
  int totalSeconds = 0;
  if (units[0] > 12 || units[1] > 59 || units[2] > 59) {  //1st Error applies to these three, units[0] > 12 units[1] > 59 units[2] > 59
     return -1;
  } else if (time.equalsIgnoreCase("AM") || time.equalsIgnoreCase("PM")) {
     totalSeconds = (hours * 3600) + (minutes * 60) + (seconds);
  } else if (time.equalsIgnoreCase("AM") && units[0] == 12) { //2nd Error applies to this units[0] == 12
     totalSeconds = (minutes * 60) + (seconds);
  } else {
     return -1;
  }

  return totalSeconds;
} 

Ответы [ 5 ]

0 голосов
/ 21 февраля 2019

java.time

static DateTimeFormatter timeFormatter
        = DateTimeFormatter.ofPattern("HH:mm:ssa", Locale.ENGLISH);

public static int secondsAfterMidnight(String time) {
  try {
    return LocalTime.parse(time, timeFormatter).get(ChronoField.SECOND_OF_DAY);
  } catch (DateTimeParseException dtpe) {
    return -1;
  }
} 

Давайте попробуем, используя тестовый код из вашего вопроса:

  String fullTime1 = "03:21:36AM";
  System.out.println(secondsAfterMidnight(fullTime1));

12096

Этоявляется рекомендуемым способом для производственного кода.

Только если вы выполняете манипуляции со строкой упражнения, вы должны использовать один из других ответов.

Ссылка: Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.

0 голосов
/ 20 февраля 2019

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

public static int secondsAfterMidnight(String time) {

    String[] units = time.split(":");
    int hours = Integer.parseInt(units[0]);
    int minutes = Integer.parseInt(units[1]);

    int seconds = 0;
    String amPm = "";

    if ( units[2].contains("AM") || units[2].contains("PM") ||
            units[2].contains("am") || units[2].contains("pm") ) {
        seconds = Integer.parseInt(units[2].substring(0, 2));
        amPm = units[2].substring(2);
    }
    else {
        seconds = Integer.parseInt(units[2]);
    }

    int totalSeconds = 0;

    if (hours > 12 || minutes > 59 || seconds > 59) {
        return -1;
    } else if (amPm.equalsIgnoreCase("AM") || amPm.equalsIgnoreCase("PM")) {
        totalSeconds = (hours * 3600) + (minutes * 60) + (seconds);
    } else if (amPm.equalsIgnoreCase("AM") && hours == 12) {
        totalSeconds = (minutes * 60) + (seconds);
    } else {
        return -1;
    }

    return totalSeconds;
}
0 голосов
/ 20 февраля 2019

Обратите внимание, что даже если вы преобразовали String в int, вы все равно сравниваете String с int.Когда вы сделаете это, также будет RuntimeException:

 int seconds = Integer.parseInt(units[2]);

, поскольку units[2] будет содержать 36AM.Поэтому вы должны использовать substring() для удаления части «AM / PM».

0 голосов
/ 20 февраля 2019

Вы уже проанализировали значения String и сохранили их в переменных hours , minutes, seconds.Затем вы можете использовать их для проверки в if.

Также присутствие AM? PM в Integer.parseInt() приведет к тому, что NumberFormatException предотвратит удаление части String из числа с помощью регулярных выражений.

Также для проверки наличия AM/PM вы можете использовать String.contains.

Пожалуйста, проверьте переформатированный код ниже:

public static int secondsAfterMidnight(String time) {
    String[] units = time.split(":");
    int hours = Integer.parseInt(units[0]);
    int minutes = Integer.parseInt(units[1]);
    int seconds = Integer.parseInt(units[2].replaceAll("[^0-9]", ""));
    int totalSeconds = 0;
    if (hours > 12 || minutes > 59 || seconds > 59) {  
        return -1;
    } else if (time.contains("AM") || time.contains("PM")) {
        totalSeconds = (hours * 3600) + (minutes * 60) + (seconds);
    } else if (time.contains("AM") && hours == 12) { 
        totalSeconds = (minutes * 60) + (seconds);
    } else {
        return -1;
    }
    return totalSeconds;
}
0 голосов
/ 20 февраля 2019

units имеет тип String, и вы пытаетесь сравнить его с int , следовательно, ошибка времени компиляции.

Вам необходимо преобразовать String с int и затем сравните его, как показано ниже:

Integer.parseInt(units[0]) > 12

и т. Д.


Также довольночем заново изобретать колесо, вы можете использовать уже существующие java-8 LocalTime , чтобы найти количество секунд для определенного времени :

public static int secondsAfterMidnight(String time) {
    LocalTime localTime = LocalTime.parse(time, DateTimeFormatter.ofPattern("hh:mm:ss a"));
    return localTime.toSecondOfDay();
}
...