【问题标题】:Read date in Java with Scanner使用扫描仪读取 Java 中的日期
【发布时间】:2014-06-22 20:43:28
【问题描述】:

好吧,我正在尝试使用扫描仪在同一行中读取字符串。例如,我想阅读:2013 年 12 月 12 日星期一,这需要放入一个字符串变量中以便帮助我打印它。

在我的代码中是这样的:

sale.setDate(sc.next());

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

我如何读取像“2013 年 12 月 12 日星期一”这样的整个字符串?

我对 sc.next sc.nextLine 等感到困惑。

【问题讨论】:

标签: java string java.util.scanner


【解决方案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()); 

【讨论】:

    【解决方案2】:

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

    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();
        }
    }
    

    【讨论】:

      【解决方案3】:

      另一种方法是利用 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));
      

      查看链接以获得深入的解释!

      【讨论】:

        【解决方案4】:

        试试这个..

        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
        }
        

        根据需要更改 dateFormat..

        【讨论】:

        • 我已经 setDate 到另一个类,我想继承它的功能来“销售”,正如我上面所说的。那么,我应该将 readDate 与 setDate 放在同一个类文件中吗?
        【解决方案5】:

        您必须使用 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| //光标停留在for之后

        【讨论】:

          【解决方案6】:

          我发现这个问题很有趣,但没有完全正确的答案,所以这里有一个简单的解决方案,可以轻松读取和解析 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 来改善,但扫描器不会被调用那么多(您受到用户输入的限制)所以这并不重要。

          【讨论】:

            【解决方案7】:

            试试这个

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-25
              • 2013-12-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多