从用户输入日期输入并将其保存为java中的日期

时间:2017-01-26 19:33:19

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

我正在尝试以(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();
    }
}

使用此代码,我在2017年(27012017或2017年1月27日)提供输入时会收到异常:

java.text.ParseException: Unparseable date: "27"
  at java.text.DateFormat.parse(DateFormat.java:366)
  at edu.lfa.GuestArrayList.main(GuestArrayList.java:49)

请指出我犯了什么错误。

2 个答案:

答案 0 :(得分:1)

Here's next()的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条件中。

答案 1 :(得分:1)

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

java.time

你正在使用麻烦的旧日期时间类,现在是旧的,取而代之的是java.time类。避免像瘟疫这样的java.util.Date类。

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

相反,请使用java.time.LocalDateLocalDate类表示没有时间且没有时区的仅限日期的值。

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

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年1月23日

关于java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore