Java使用Scanner从一行中输入日期

3
我正在尝试从用户那里读取日期并传递到 GregorianCalendar 变量。目前我的设置很尴尬,需要逐行读取。你能帮忙想一个在一行内收集输入的解决方案吗?我找到了 SimpleDateFormat 类,但是似乎没有很好地符合这个特定的需求。
    Scanner time = new Scanner(System.in)

    System.out.println("Type year: ");int y =time.nextInt();
    System.out.println("Type month: ");int m =time.nextInt();
    System.out.println("Type day: ");int d = time.nextInt();
    System.out.println("Type hour: ");int h = time.nextInt();
    System.out.println("Type minute: ");int mm = time.nextInt();

    GregorianCalendar data = new GregorianCalendar(y,m,d,h,mm);
1个回答

7

我建议您读入一行文本,具有特定的格式,然后使用 DateFormat 进行解析。例如:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm",
                                         Locale.US);
System.out.println("Enter date and time in the format yyyy-MM-ddTHH:mm");
System.out.println("For example, it is now " + format.format(new Date()));
Date date = null;
while (date == null) {
    String line = scanner.nextLine();
    try {
        date = format.parse(line);
    } catch (ParseException e) {
        System.out.println("Sorry, that's not valid. Please try again.");
    }
}

如果可以的话,请使用Java 8的java.time类或Joda Time - 基本上是相同的思路,但使用这些API的类。两者都比使用DateCalendar要好得多。


嗨Jon,我知道可能有更好的解决方案。与此同时,我还在学习中,我检查了你的解决方案,似乎“date”不是GregorianCalendar构造函数接受的格式(而我已经使用了GregorianCalendar)。因此,如果有其他解决方案可以实现(并且不太困难),我将不胜感激。顺便说一下,谢谢你。 - Turo
@Turo:在构建完日历后,您可以调用设置时间的函数。 - Jon Skeet
设置时间是什么意思? - Turo
好的,明白了:) GregorianCalendar 的 setTime 方法。我会尝试的,谢谢。 - Turo
@Turo 答案中建议的格式是标准格式,由ISO 8601定义。这种合理的格式在商业和工业中越来越普遍,并且通常在现代互联网和信息协议中指定。这种格式被Joda-Time和java.time用作生成和解析日期时间值的字符串表示的默认格式。 - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接