代码之家  ›  专栏  ›  技术社区  ›  Yijinsei

按以下格式分析字符串中的日期:dd/mm/yyyy[到dd/mm/yyyy]

  •  4
  • Yijinsei  · 技术社区  · 16 年前

    我认为Java中用这个格式解析字符串最好的方法是什么 年/月/日[至年/月/日]。带[]的字符串是可选的,dd代表日期的两位数表示,mm代表月份的两位数表示,yyyy代表年份的四位数表示。


    更新

    感谢大家的快速响应,但是我忘了告诉你们,符号是可选的,在一个示例字符串中没有符号。

    • 22/01/2010
    • 2010年1月22日至2010年1月23日
    • 无效的

    目前我是这样写代码的,但是很难看=(

    String _daterange = (String) request.getParameter("daterange");
        Date startDate = null, endDate = null;
        // Format of incoming dateRange is 
        if (InputValidator.requiredValidator(_daterange)) {
            String[] _dateRanges = _daterange.toUpperCase().split("TO");
            try {
                startDate = (_dateRanges.length > 0) ? sdf.parse(_dateRanges[0]) : null;
                try{
                    endDate = (_dateRanges.length > 1) ? sdf.parse(_dateRanges[1]) : null;
                }catch(Exception e){
                    endDate = null;
                }
            } catch (Exception e) {
                startDate = null;
            }
        }
    
    4 回复  |  直到 8 年前
        1
  •  10
  •   duffymo    16 年前

    使用 java.text.DateFormat java.text.SimpleDateFormat 做这件事。

    DateFormat sourceFormat = new SimpleDateFormat("dd/MM/yyyy");
    String dateAsString = "25/12/2010";
    Date date = sourceFormat.parse(dateAsString);
    

    更新:

    如果字符串中有两个日期,则必须将它们分成两部分。我认为其他人已经指出了“分裂”的想法。我只是在空白处休息一下,然后把“to”扔掉。

    别担心效率。你的应用程序很可能被比这更糟糕的低效率所困扰。使它正确工作,并且只有当分析告诉您这个片段是最坏的罪犯时才重构它。

        2
  •  1
  •   Basil Bourque    8 年前

    DR

    LocalDate.parse( 
        "22/01/2010" , 
        DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
    )
    

    _更多_

    // String input is:
    // (a) long: "22/01/2010 to 23/01/2010". 
    // (b) short: "22/01/2010".
    // (c) null.
    
    DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
    
    if( input.length() == 24 ) {           // Ex: "22/01/2010 to 23/01/2010"
        List<LocalDate> lds = new ArrayList<>( 2 );
        String[] inputs = input.split( " to " );
        for( String nthInput : inputs ) {
            LocalDate ld = LocalDate.parse( nthInput , f ) ;
            lds.add( ld );
        }
        … // Do what you want with `LocalDate` objects collection.
    
    } else if( input.length() == 10 ) {    // Ex: "22/01/2010"
        LocalDate ld = LocalDate.parse( input , f ) ;
        … // Do what you want with `LocalDate` object.
    
    } else if( null == input ) {
        … // Decide what you want to do for null input.
    
    } else {
        System.out.println( "Unexpected input: " + input ) ;
    }
    

    看到这个 code run live at IdeOne.com .

    使用JavaTimes

    另一个答案是使用麻烦的旧日期时间类,这些类现在是遗留的,由java.time类取代。

    至于处理多种类型的字符串,请查看字符串的长度。

    if( input.length() == 10 ) { … }
    

    如果长,则在4个字符的子字符串__到__上拆分。

    String[] inputs = "22/01/2010 to 23/01/2010".split( " to " );
    

    将日期字符串分析为 LocalDate .

    DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
    LocalDate ld = LocalDate.parse( "22/01/2010" , f );
    

    关于 Java.时间

    这个 java.time 框架是在Java 8和之后构建的。这些阶级取代了麻烦的旧阶级。 legacy 日期时间类,如 java.util.Date , Calendar 和; SimpleDateFormat .

    这个 Joda-Time 项目,现在 maintenance mode ,建议迁移到 java.time 类。

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

    你可以换 Java.时间 直接使用数据库的对象。使用A JDBC driver 顺从 JDBC 4.2 或稍后。不需要字符串,不需要 java.sql.* 类。

    在哪里获取java.time类?

    这个 ThreeTen-Extra Project使用其他类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter more .

        3
  •  0
  •   dogbane    16 年前

    像这样的方法应该可以做到:

    String input = "02/08/2010 [to 31/12/2010]";
    DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    Date d  = format.parse(input.split(" ")[0]);
    System.out.println(d) ;
    
        4
  •  0
  •   Neel    16 年前

    你可以这样做-

    String input = "02/08/2010 [to 31/12/2010]";
        java.text.DateFormat format = new java.text.SimpleDateFormat("dd/MM/yyyy");
        java.util.Date d = null;
        try {
            d = format.parse(input.split(" ")[0]);
        } catch (java.text.ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(d) ;
    

    如果不存在带[]的字符串 input.split(" ")[0] 只返回第一个字符串。