以这种格式从字符串解析日期:dd / MM / yyyy [to dd / MM / yyyy]

时间:2010-08-02 09:33:06

标签: java regex string

我认为Java中用这种格式解析String的最佳方法是什么 dd / MM / yyyy [对dd / MM / yyyy]。带[]的字符串是可选的,dd代表日期的2位数表示,MM是月份的2位数表示,yyyy是年份的4位数表示。


更新

感谢大家的快速响应,但是我忘了告诉你[]是符号可选,字符串中没有[]示例字符串可能是

  • 22/01/2010
  • 22/01/2010至23/01/2010
  • null

目前我用这种方式编写代码,工作但很难看=(

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 个答案:

答案 0 :(得分:11)

使用java.text.DateFormatjava.text.SimpleDateFormat来执行此操作。

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

更新:

如果您有两个日期隐藏在该字符串中,则必须将它们分成两部分。我认为其他人已经指出了“分裂”的想法。我只是在空白处打破并扔掉“TO”。

不要担心效率。你的应用程序很可能充满了比这更糟糕的低效率。只有在分析告诉你这个片段是最糟糕的罪犯时才能正常工作并重构它。

答案 1 :(得分:1)

TL;博士

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

使用java.time

其他Answers使用现在遗留下来的麻烦的旧日期时间类,取而代之的是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.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

这样的事情可以解决问题:

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

答案 3 :(得分:0)

你可以做这样的事情 -

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]将仅返回第一个字符串。