【问题标题】:Taking string as input and converting to time/date in java [duplicate]将字符串作为输入并在java中转换为时间/日期[重复]
【发布时间】:2021-02-08 17:01:15
【问题描述】:

当我使用next() 输入字符串时,我没有收到任何异常


String a=sc.next()
SimpleDateFormat b=new SimpleDateFormat("dd/MM/yyyy");
b.parse(a);
System.out.println(b.format(b.parse(a)));

但是当我使用 Scanner 类的nextLine() 方法输入时,我得到一个异常

String a=sc.nextLine()
SimpleDateFormat b=new SimpleDateFormat("dd/MM/yyyy");
b.parse(a);
System.out.println(b.format(b.parse(a)));

如何解决这个问题,当使用sc.nextLine() 和日期格式为"hh:mm a" 时,我得到了同样的异常

【问题讨论】:

  • 您遇到了什么异常?扫描仪实际上读入了什么?是用户输入还是从文件中读取数据?
  • It is user input...java.text.ParseException: Unparseable date: ""...这是我得到的异常。实际上问题是“每个测试用例的第一行包含单个时间 P " 并且时间的形式为 "hh:mm a"(例如上午 10:43)...无法弄清楚如何获取此输入。
  • 请停止使用SimpleDateFormat。那个类,就像DateCalendar 一样,已经过时并且troublesome。请改用 java.time 包中的类。
  • 欢迎来到 Stack Overflow。为了更好地接收您的下一个问题,您需要在发布之前阅读 How do I ask a good question?How to create a Minimal, Reproducible Example

标签: java java-time


【解决方案1】:

这个问题可能与Scanner 的工作原理有关。
documentationnext

从此扫描器中查找并返回下一个完整的令牌。 之前是一个完整的标记,然后是与分隔符模式匹配的输入。

nextLine:

将此扫描器前进到当前行并返回被跳过的输入。

默认分隔符包括换行符 (\n)。

我假设输入有一个前导换行符(空行)被next删除,而不是nextLine

测试:

  • new Scanner("\ntest\n").next() 返回"test"
  • new Scanner("\ntest\n").nextLine() 返回 ""(空字符串)

这会发生,例如,如果先前的 Scanner 输入是用 nextInt()(或类似的)读取的 - 这不会消耗数字后的任何换行符:

var sc = new Scanner("123\n456\n");
var i = sc.nextInt();  // will be 123
var str = sc.nextLine();  // will be the empty string "" (between 123 and \n)
str = sc.nextLine();  // now it is "test"

String 用作Scanner 的输入,因为它更容易描述,同样会发生在用户输入中,如果用户键入返回键(通常用于结束输入),则会读取换行符子>

如果是这种情况,解决方法是在读取一个数字后调用nextLine()(甚至用nextLine()读取数字然后解析它)

更多详情请查看这个问题:Scanner is skipping nextLine() after using next() or nextFoo()?

此答案基于异常提到空字符串 "" 不可解析
还考虑 vsfDawg 的 answer - next() 将在空白字符处停止的评论

【讨论】:

  • BTW "dd/MM/yyyy" 不会解析时间
【解决方案2】:

如果您的输入如下所示:

10/12/2020 11:59:59 am

那么Scannernext() 方法的第一次调用将返回"10/12/2020",而nextLine() 的第一次调用将返回"10/12/2020 11:59 am"。前者与您的 DateFormat 匹配,而后者不匹配。这可能next() 的行为原因,但nextLine() 出现异常。

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 1970-01-01
    • 2016-03-08
    • 2016-07-30
    • 2021-07-23
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多