我正在尝试以(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)
请指出我犯了什么错误。
答案 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.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年1月23日
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。