【问题标题】:Parse Date from String in this format : dd/MM/yyyy [to dd/MM/yyyy]以这种格式从字符串解析日期:dd/MM/yyyy [to dd/MM/yyyy]
【发布时间】:2010-08-02 09:33:06
【问题描述】:

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


更新

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

  • 22/01/2010
  • 22/01/2010 至 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 regex string


【解决方案1】:

使用java.text.DateFormatjava.text.SimpleDateFormat 来实现。

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

更新:

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

不用担心效率。您的应用程序可能会出现比这更糟糕的低效率问题。使其正常工作并仅在分析告诉您此 sn-p 是最严重的违规者时对其进行重构。

【讨论】:

  • 我不确定 DateFormat 类是否可以解析带有 两个 日期的字符串。他可能需要先手动检查长度并拆分它。
  • 感谢您的快速响应。我尝试了类似的东西,但我认为效率不高。首先我使用 String[]token = String.split("TO");然后如果 token.length > 0 sdf.parse(token[0]); if token.length > 1 sdf.parse(token[1]);
【解决方案2】:

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

其他答案使用麻烦的旧日期时间类,这些类现在是遗留的,被 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.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案3】:

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

    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】:

      你可以这样做 -

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多