我正在尝试从用户那里获取一个字符串输入,其输入格式为“ HH:MM am / pm”,例如“ 9:10 am”
稍后将在其中用于显示小时,分钟和上午或下午的输入(在我的Time类中)。
最终,我将实现一个try...except..
来检查输入(小时/分钟,它必须是数字,介于0到12之间,并且只能使用am / pm)。
目前,我的代码仅在用户输入HH:MM am/pm
(而不是其间的空格)时有效,而在输入(例如)时失败。 9:10pm
由于缺少空格。
我的问题-我可以强制输入,以便用户必须遵循某种约定吗?在这种情况下,时间和上午/下午之间必须有空格吗?
在我的客户类中,代码如下:
class Client
{
public static void main(String[] args)
{
// I have removed the Scanner input method and use hardcoded values for now
String input = "9:10 pm";
String[] inputSplit = input.split(" ");
System.out.printf("\ntime:\t%s\n", inputSplit[0]);
System.out.printf("am/pm:\t%s\n", inputSplit[1]);
String[] time = inputSplit[0].split (":");
int hour = Integer.parseInt (time[0].trim() );
int min = Integer.parseInt (time[1].trim() );
System.out.printf("hr:\t\t%d\n", hour);
System.out.printf("mins:\t%d\n", min);
}
}
答案 0 :(得分:0)
使用replaceAll()在输入的时间中增加宽容度,并使用java.time验证格式
时间格式验证通过以下方式完成:
LocalTime.parse(time, DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH));
在测试平台和上下文中进行时间格式验证:
public static void main(String[] args) {
List<String> inputList = Arrays.asList("1:10 pm", "02:10PM", "9:10pm"
, " 11:10 aM ", "14:10AM", "10:01");
DateTimeFormatter df = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
for (String input : inputList) {
// We give the input some tolerance regarding space and small letters
String time = input.trim()
.replaceAll("[aA][mM]", " AM")
.replaceAll("[pP][mM]", " PM")
.replaceAll("\\s+", " ");
String formattedTime = "";
try {
formattedTime = LocalTime.parse(time, df).format(df);
} catch (DateTimeParseException dtpe) {
System.out.printf("%nTime '%s' is not valid!%n", input.trim());
}
if(!formattedTime.isEmpty()) {
String[] splitTime = formattedTime.split("[\\s:]");
String hourAsString = splitTime[0];
String minAsString = splitTime[1];
String amPmAsString = splitTime[2];
System.out.printf("\ntime:\t%s\n", formattedTime);
System.out.printf("am/pm:\t%s\n", amPmAsString);
int hour = Integer.parseInt(hourAsString);
int min = Integer.parseInt(minAsString);
System.out.printf("hr:\t\t%d\n", hour);
System.out.printf("mins:\t%d\n", min);
}
}
}
输出:
time: 1:10 PM
am/pm: PM
hr: 1
mins: 10
time: 2:10 PM
am/pm: PM
hr: 2
mins: 10
time: 9:10 PM
am/pm: PM
hr: 9
mins: 10
time: 11:10 AM
am/pm: AM
hr: 11
mins: 10
Time '14:10AM' is not valid!
Time '10:01' is not valid!
某些“模式字母和符号”的含义:
h = clock-hour-of-am-pm (1-12)
m = minute-of-hour
a = am-pm-of-day
在此处阅读有关“图案字母和符号”的更多信息:
https://docs.oracle.com/javase/10/docs/api/java/time/format/DateTimeFormatter.html#ISO_DATE
答案 1 :(得分:0)
public static void main(String[] args)
{
// I have removed the Scanner input method and use hardcoded values for now
String input = "9:10pm";
String newTime="";
String ampm= "";
if(input.contains("am")) {
newTime= input.substring(0,input.indexOf("am"));
ampm=input.substring(input.indexOf("am"));
}
else {
newTime= input.substring(0,input.indexOf("pm"));
ampm=input.substring(input.indexOf("pm"));
}
newTime=newTime.concat(" ").concat(ampm);
System.out.println(newTime);
String[] inputSplit = newTime.split(" ");
System.out.printf("\ntime:\t%s\n", inputSplit[0]);
System.out.printf("am/pm:\t%s\n", inputSplit[1]);
String[] time = inputSplit[0].split (":");
int hour = Integer.parseInt (time[0].trim() );
int min = Integer.parseInt (time[1].trim() );
System.out.printf("hr:\t\t%d\n", hour);
System.out.printf("mins:\t%d\n", min);
}