将HH:MM:SS(AM / PM)的字符串时间格式转换为秒

时间:2019-02-20 05:43:21

标签: java string datetime compiler-errors

因此,我有此作业,要求我们采用HH:MM:SSAM或HH:SS:MMPM的时间的String格式。限制是如果格式错误,缺少任何形式的AM或PM,缺少数字或采用24小时格式,则无法运行。

我的想法全都没了,但是对于我的陈述,这给了我以下错误:

二进制运算符'>'的错误操作数类型 无与伦比的类型:字符串和整数

我是否对它们进行了不正确的转换,或者我做错了其他事情?

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 :(得分:1)

units type 字符串,您正尝试将其与 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();
}

答案 1 :(得分:1)

请注意,即使您已将String转换为int,仍在将Stringint进行比较。执行此操作时还将出现一个RuntimeException

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

由于units[2]将包含36AM。因此,您应该使用substring()删除“ AM / PM”部分。

答案 2 :(得分:1)

您已经解析了String的值,并将它们保存在变量hours , minutes, seconds中。然后,您可以在if中使用它们进行检查。

Integer.parseInt()中还存在AM?PM将导致NumberFormatException避免使用正则表达式从数字中删除字符串部分。

也可以使用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;
}

答案 3 :(得分:0)

我尚未验证您计算秒的逻辑,但是此代码已更正:

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

答案 4 :(得分:0)

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 tutorial: Date Time解释了如何使用java.time。