LocalDateTime 通过 Scannerinput

LocalDateTime via Scannerinput

我需要从 Scanner 插入一个 LocalDateTime。 我们需要使用输入格式

dd.MM. HH:mm

对于Scanner(不使用额外变量!),如何将这些扫描值放入起始变量?

Scanner sc = new Scanner(System.in); 
System.out.println("Year:");
int year = sc.nextInt(); 

System.out.println("Start:");
//--- (?) scan something like dd.MM. HH:mm --- 
start = LocalDateTime.of(year, month, dayOfMonth, hour, minute)

如果扫描的输入不是 dd.MM. HH:mm 格式,程序应该抛出一个 IllegalArgumentException。我知道它是如何工作的,只是让你知道我们不能使用 sc.next()getsubstring() :(

Scanner 允许您指定输入匹配的模式。如果匹配成功,您可以查询它。这是基本思路:

public class Example {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("Year:");
        int year = sc.nextInt();

        System.out.println("Date-time in format: dd.MM. HH:mm");
        sc.nextLine();
        sc.findInLine("(\d\d)\.(\d\d)\. (\d\d):(\d\d)");
        try {
            MatchResult mr = sc.match();
            int month = Integer.parseInt(mr.group(2));
            int day = Integer.parseInt(mr.group(1));
            int hour = Integer.parseInt(mr.group(3));
            int minute = Integer.parseInt(mr.group(4));
            LocalDateTime dt = LocalDateTime.of(year, month, day, hour, minute);
            System.out.println(dt);
        } catch (IllegalStateException e) {
            System.err.println("Invalid date-time format.");
        }
    }
}

如果你想要更花哨的东西,你可以使用命名组而不是引用数字。您还可以在输入上添加额外的约束,以便它成为合法的日期时间格式,但 LocalDateTime.of 无论如何都会处理这个问题,这让我想到了...

关于异常处理的注意事项: 在这种情况下,如果模式不匹配,则根据请求抛出 IllegalStateException。但是,如果以(有效)格式给出的数字没有意义,例如 90 表示月份,LocalDateTime.of 将抛出相同的异常。您可能希望单独捕获 DateTimeException