使用Scanner在Java中读取日期

时间:2014-05-06 09:48:54

标签: java string java.util.scanner

好吧,我试图在同一行读取带有扫描仪的字符串。对于exapme,我想阅读:2013年12月12日星期一,这需要放在一个字符串变量中,以帮助我打印它。

在我的代码中有这样的:

sale.setDate(sc.next());

使用命令sc.next()我不能以我提到的形式提供日期,但只能采用以下形式:mmddyy或mm / dd / yyyy

我怎样才能阅读整个字符串,例如" 2013年12月12日星期一" ?

关于sc.next sc.nextLine等,我对此感到困惑。

7 个答案:

答案 0 :(得分:1)

对于扫描仪:http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html next()和hasNext()方法首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个标记。 nextLine使此扫描器超过当前行并返回跳过的输入。

使用日期DateFormat来解析字符串到日期;我想setDate需要一个Date

    Scanner scanner = new Scanner("Monday 12 December 2013,a, other fields");
    scanner.useDelimiter(",");

    String dateString = scanner.next();
    //System.out.println(dateString);

    DateFormat formatter = new SimpleDateFormat("EEEE dd MMM yyyy");
    Date date = formatter.parse(dateString);
    //System.out.println(date);
    sale.setDate(sc.next()); 

答案 1 :(得分:1)

即使我遇到了同样的问题,但之后能够解决下面提到的代码。希望它有所帮助。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;

public class Datinput {

    public static void main(String args[]) {
        int n;
        ArrayList<String> al = new ArrayList<String>();
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        String da[] = new String[n];
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        sdf.setLenient(false);
        Date date[] = new Date[n];
        in.nextLine();
        for (int i = 0; i < da.length; i++) {
            da[i] = in.nextLine();
        }
        for (int i = 0; i < da.length; i++) {

            try {
                date[i] = sdf.parse(da[i]);
            } catch (ParseException e) {

                e.printStackTrace();
            }
        }

        in.close();
    }
}

答案 2 :(得分:1)

另一种方法是利用Java 8中的LocalDateTimeDateTimeFormatter。找到此示例here

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss.SSS);
LocalDateTime dateTime = LocalDateTime.parse(s.next(), formatter);
System.out.println(dateTime.format(formatter));

查看链接以获取详细说明!

答案 3 :(得分:0)

试试这个..

public void readDate() throws Exception{
    String dateFormat = "dd/MM/yyyy";
    Scanner scanner = new Scanner(System.in);
    setDate(new SimpleDateFormat(dateFormat).parse(scanner.nextLine()));
}
public void setDate(Date date){
    // do stuff
}

根据需要更改日期格式..

答案 4 :(得分:0)

您必须使用nextLine来获取具有中间空格的单词。

next()只能读取输入直到空格。它无法读取由空格分隔的两个单词。此外,next()在读取输入后将光标放在同一行。

nextLine()读取包含单词之间空格的输入(即,读取直到行尾\ n)。读取输入后,nextLine()将光标定位在下一行。

Scanner sc=new Scanner(System.in);
System.out.println("enter string for c");
String c=sc.next();
System.out.println("c is "+c);
System.out.println("enter string for d");
String d=sc.next();
System.out.println("d is "+d);

输出:

enter string for c
abc def             
c is abc  
enter string for d
d is  defabc def| 

在第一种情况下,abc | def //光标停留在c

之后

在第二种情况下abc def | //光标停留在

之后

答案 5 :(得分:0)

我觉得这个问题很有意思,但没有一个完全正确的答案,所以这里有一个简单的解决方案,可以轻松阅读和解析Date形式的Scanner

最好的方法是创建一个可以为你做的方法,因为Scanner是最终的,我们只能做一个工具箱而不是子类。但这很容易使用:

public static Date readDate(Scanner sc, String format){
     return new SimpleDateFormat(format).parse(sc.nextLine());
}

这会接受格式和扫描程序,不在这里管理它,因为打开Scanner而不关闭它会很麻烦(但是如果你关闭它,你就不能打开它它再次)。

Scanner sc = new Scanner(System.in);
ToolBox.readDate(sc, "YYYY-MM-DD");
ToolBox.readDate(sc, "YYYY-MM-DD HH:mm:ss");
ToolBox.readDate(sc, "YYYY-MM-DD");
sc.close();

这可以通过不每次重新创建SimpleDateFormat来改进,但是扫描器没有被调用那么多(你受到用户输入的限制)所以这并不重要。

答案 6 :(得分:0)

尝试这个

final Scanner sc = new Scanner(System.in);
final String timeString = sc.next();
final LocalTime time = LocalTime.parse(timeString);