我正在尝试将输入字符串日期解析为GregorianCalendar:
Scanner scan = new Scanner(System.in);
String next = scan.next("[0-9]{2}.[0-9]{2}.[0-9]{4} [0-9]{2}:[0-9]{2}");
scan.nextLine();
DateFormat df = new SimpleDateFormat("dd.MM.yyyy hh:mm");
Date date = null;
try {
date = df.parse(next);
} catch (ParseException e1) {
e1.printStackTrace();
}
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
System.out.println(cal.getTime());
但它一直给出这个错误:
java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.next(Unknown Source)
任何人都可以帮助我吗?如果我没有指定小时和分钟但不是这样的话,这是有效的......
答案 0 :(得分:1)
查看由Scanner.next(String)
调用的Scanner.next(Pattern)
源代码,粗略方法遵循以下步骤:
使用分隔符模式从流中的当前位置跳过所有分隔符。
在流中搜索下一个分隔符。阻止是否需要更多输入来查找分隔符。如果流结束则继续
检查模式是否与当前位置和下一个分隔符之间的标记匹配(或流的结尾)。
如果匹配则返回令牌。否则,抛出异常。
由于空格与默认分隔符模式("\\p{javaWhitespace}+"
)匹配,因此扫描程序会在日期部分进行标记,并尝试将该标记与模式匹配并失败。
01.01.2014 00:00
^--------^^
token |
|
delimiter
一种方法是单独扫描它们:
String nextDate = scan.next("[0-9]{2}\\.[0-9]{2}\\.[0-9]{4}");
String nextTime = scan.next("[0-9]{2}:[0-9]{2}");
String next = nextDate + " " + nextTime;
在我看来,这是解决问题的最简单方法,避免涉及定界符模式。不过,我不知道这是否是最佳解决方案。