【问题标题】:Take date input from user and save it as date in java从用户获取日期输入并将其保存为java中的日期
【发布时间】:2017-01-26 19:33:19
【问题描述】:

我正在尝试以(dd/mm/yy) 格式从用户那里获取输入,将其保存为相同的格式并使用getter、setter 将其传递给另一个类。我试过这种方式:

这是我尝试过的:

public static void main(String[] args)
{
    Scanner input = new Scanner(System.in);
    SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
    Guest gstObject = new Guest();
    try {
        System.out.println("Enter check-in date (dd/mm/yy):");
        String cindate = input.next();
        Date date1 = myFormat.parse(cindate);
        gstObject.setIndate(date1);
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

使用此代码,当我在(27012017 或 27 01 2017)中输入时遇到异常:

java.text.ParseException:无法解析的日期:“27” 在 java.text.DateFormat.parse(DateFormat.java:366) 在 edu.lfa.GuestArrayList.main(GuestArrayList.java:49)

请指出我犯了什么错误。

【问题讨论】:

  • 使用input.nextLine() 而不是input.next()。此外,您正在提示用户输入与您的 SimpleDateFormat 实际接受的格式不同的格式,因此请注意这一点。
  • 那么如果你想让他们输入dd/mm/yy,你为什么写myFormat = new SimpleDateFormat("dd MM yyyy");?
  • 尝试输入“27 01 2017”,因为您的日期格式为“dd MM yyyy”或将格式更改为“dd/MM/yyyy”。

标签: java java.util.scanner java.util.date


【解决方案1】:

Here'snext() 的 javadoc,它是这么写的:

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

默认分隔符是空格,因此它只读取27。您需要使用nextLine() 阅读整行。以下应该工作:

System.out.println("Enter check-in date (dd/mm/yy):");
String cindate = input.nextLine();
if(null != cindate && cindate.trim().length() > 0){
    Date date1 = myFormat.parse(cindate);
}

更新要检查null或空字符串,您需要将解析代码包装在if条件中。

【讨论】:

  • Metha 我将String cindate = input.next(); 更改为String cindate = input.nextLine(); 现在我在没有输入日期的情况下出现错误。错误是java.text.ParseException: Unparseable date: "" at java.text.DateFormat.parse(DateFormat.java:366) at edu.lfa.GuestArrayList.main(GuestArrayList.java:49)
  • 我已更新我的答案以包括 null 和空字符串检查。基本上,如果输入为 null 或只是空格,则可以跳过解析并显示错误消息。
【解决方案2】:

其他答案解决了如何正确使用Scanner。我会解决一些其他问题。

java.time

您正在使用麻烦的旧日期时间类,现在是遗留的,被 java.time 类所取代。避免像瘟疫一样使用java.util.Date 类。

此外,您不恰当地尝试使用日期+时间类来表示仅日期值。

改为使用java.time.LocalDate。 LocalDate 类表示没有时间和时区的仅日期值。

要解析用户的输入,请指定格式模式以匹配完全用户的预期输入。

DateTimeFormatter f = DateTimeFormatter.parse( "dd/mm/uuuu" );

解析用户输入。

LocalDate ld = LocalDate.parse( input , f );

在您的商务舱Guest 上,创建LocalDate 类型的成员变量。

要持久化LocalDate,您可以序列化为标准ISO 8601 格式的文本。只需致电toString。

String output = guest.getLocalDate().toString();

2017-01-23


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多