java - 将字符串格式的日期解析为公历,包含小时和分钟

标签 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)

有人可以帮我吗?如果我不指定小时和分钟,这会起作用,但不是这样......

最佳答案

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

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

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

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

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

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

在我看来,这是该问题最简单的解决方案,它避免了涉及分隔符模式。但我不知道这是否是最好的解决方案。

关于java - 将字符串格式的日期解析为公历,包含小时和分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27169447/

相关文章:

java - 如何将 JPasswordField 中的文本剪切/复制为字符数组?

java - Java 源文件中的重音字符在 JSF 页面中无法正确显示

java - 如何将焦点设置在 editText Preference 上并自动显示键盘?

java - 如何确定 Grails 中的父类

javascript - 如何替换 '*' 的所有实例

javascript - 如何使这个正则表达式与 JavaScript 兼容?

java - 在 Java 中获取准确的日期而不干扰 XMLGregorianCalendar

regex - Xcopy 命令 : How to display only the destination path of files copied

java - 获取正确的星期几和月份

java - 公历