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

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


更新

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

  • 22/01/2010
  • 2010年1月22日至23/01/2010
  • 空值

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

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

使用java.text.DateFormatjava.text.SimpleDateFormat来完成它。

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

更新:

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

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

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

请参阅IdeOne.com上的此代码 。

使用java.time

其他Answers使用麻烦的旧日期时间类,这些类现在是遗留的,由java.time类取代。

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

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

如果长,则拆分4个字符的子串“to”。

 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及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

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

从哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

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

像这样的东西应该做的伎俩:

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

你可以这样做 –

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