因此,我有此作业,要求我们采用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;
}
答案 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
,仍在将String
与int
进行比较。执行此操作时还将出现一个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)
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。