Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从用户处获取日期输入,并将其保存为java中的日期_Java_Java.util.scanner_Java.util.date - Fatal编程技术网

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

从用户处获取日期输入,并将其保存为java中的日期,java,java.util.scanner,java.util.date,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 gstObj

我试图从用户那里获取
(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) 请指出我犯了什么错误。

javadoc对于
next()
,它是这样说的:

查找并返回此扫描程序中的下一个完整令牌。A. 完整标记的前面和后面是与 分隔符模式

默认分隔符是空格,因此它只读取
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
条件中包装解析代码。

其他答案说明了如何正确使用
扫描仪。我将讨论其他一些问题

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

此外,您试图用日期+时间类表示仅日期的值是不恰当的

相反,请使用
java.time.LocalDate
。该类表示一个仅限日期的值,不包含一天中的时间和时区

要分析用户的输入,请指定一种格式模式,使其与用户的预期输入完全匹配

DateTimeFormatter f = DateTimeFormatter.parse( "dd/mm/uuuu" );
解析用户输入

LocalDate ld = LocalDate.parse( input , f );
在您的商务类
Guest
上,将成员变量设置为
LocalDate
类型

要持久保存
LocalDate
,可以将其序列化为标准格式的文本。只需调用
toString

String output = guest.getLocalDate().toString();
2017-01-23


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

使用
input.nextLine()
而不是
input.next()
。此外,您正在提示用户使用与您的
SimpleDateFormat
实际接受的格式不同的格式,因此请注意。如果您希望用户输入
dd/mm/yy
,为什么要编写
myFormat=new SimpleDateFormat(“dd-mm-yyyy”)?尝试输入“27 01 2017”,因为日期格式为“dd-MM-yyyy”,或将格式更改为“dd/MM/yyyy”。我更改了
字符串cindate=input.next()
to
String cindate=input.nextLine()现在我没有输入日期就出错了。错误为
java.text.ParseException:Unparseable date:“”位于edu.lfa.GuestArrayList.main(GuestArrayList.java:49)的java.text.DateFormat.parse(DateFormat.java:366)
我已更新答案,以包含空字符串检查。基本上,如果输入为null或仅为空格,则可以跳过解析并显示错误消息。
String output = guest.getLocalDate().toString();