将字符串格式解析为格里高利历,以小时和分钟为单位

时间:2014-11-27 11:20:00

标签: java regex gregorian-calendar

我正在尝试将输入字符串日期解析为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)

任何人都可以帮助我吗?如果我没有指定小时和分钟但不是这样的话,这是有效的......

1 个答案:

答案 0 :(得分:1)

查看由Scanner.next(String)调用的Scanner.next(Pattern)源代码,粗略方法遵循以下步骤:

  1. 使用分隔符模式从流中的当前位置跳过所有分隔符。

  2. 在流中搜索下一个分隔符。阻止是否需要更多输入来查找分隔符。如果流结束则继续

  3. 检查模式是否与当前位置和下一个分隔符之间的标记匹配(或流的结尾)。

  4. 如果匹配则返回令牌。否则,抛出异常。

  5. 由于空格与默认分隔符模式("\\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;
    

    在我看来,这是解决问题的最简单方法,避免涉及定界符模式。不过,我不知道这是否是最佳解决方案。