Java 如何强制输入某个约定

Java 如何强制输入某个约定,java,Java,我试图从用户那里获取字符串输入,输入格式为“HH:MM am/pm”,例如“9:10 am” 我稍后将使用它显示小时、分钟和am或pm(在我的时间类中)的输入 最后,我将实现一个try…except..来检查输入(对于小时/分钟,它必须是数值,介于0-12之间,并且只能使用am/pm)。 目前,我的代码仅在用户在HH:MM am/pm中输入时有效(不是中间的空格),如果输入失败,例如9:10pm由于缺少空格 我的问题-我可以强制输入,这样用户就必须遵循特定的约定吗?在这种情况下,时间和am/pm

我试图从用户那里获取字符串输入,输入格式为“HH:MM am/pm”,例如“9:10 am”

我稍后将使用它显示小时、分钟和am或pm(在我的时间类中)的输入

最后,我将实现一个
try…except..
来检查输入(对于小时/分钟,它必须是数值,介于0-12之间,并且只能使用am/pm)。 目前,我的代码仅在用户在
HH:MM am/pm
中输入时有效(不是中间的空格),如果输入失败,例如
9:10pm
由于缺少空格

我的问题-我可以强制输入,这样用户就必须遵循特定的约定吗?在这种情况下,时间和am/pm之间必须有一个间隔

在我的客户端类中,代码如下所示:

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

使用replaceAll()将tolarance添加到时间输入中,并使用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
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);
      }