通过Scannerinput进行LocalDateTime

时间:2016-02-18 15:44:56

标签: java input java.util.scanner java-time

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

dd.MM. HH:mm

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

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() :(

1 个答案:

答案 0 :(得分:0)

-- Function: retrive_row_count() -- DROP FUNCTION retrive_row_count(); CREATE OR REPLACE FUNCTION retrive_row_count() RETURNS integer AS $BODY$ DECLARE v_table text; BEGIN FOR v_table IN SELECT table_schema||'.'||table_name FROM information_schema.columns WHERE column_name = 'gender' LOOP EXECUTE 'INSERT INTO test.row_count(table_name , count) SELECT '''||v_table || ''' , COUNT(*) FROM '||v_table || ' WHERE gender IS NULL' ; END LOOP; return 1; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION retrive_row_count() OWNER TO postgres; 允许您指定输入将匹配的模式。如果匹配成功,您可以查询它。这是基本的想法:

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将抛出相同的异常,例如LocalDateTime.of月份。您可能希望单独捕获90