如何将模糊字符串解析为日期?

时间:2011-07-11 16:20:12

标签: java string parsing date

我正在试图找出一种将字符串解析为日期对象的“简单”方法。

String可以是yyyyMMdd,yyyyMMddHHmm或yyyyMMddHHmmSS。

目前,我正在查看String的长度,并根据长度创建DateParser。有更优雅的方式吗?

5 个答案:

答案 0 :(得分:6)

或者你可以用零填充你的字符串:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmSS") {
  @Override
  public Date parse(String s) throws ParseException {
    return super.parse((s + "000000").substring(0, 14));
  }
};

System.out.println(sdf.format(sdf.parse("20110711182405")));
System.out.println(sdf.format(sdf.parse("201107111824")));
System.out.println(sdf.format(sdf.parse("20110711")));

答案 1 :(得分:4)

我会照原样,查看字符串的长度,并创建一个合适的SimpleDateFormat实例。

SimpleDateFormat getFormatFor( String dateString ){
    if ( dateString.length() == 8  ) return new SimpleDateFormat("yyyyMMdd");
    if ( dateString.length() == 14 ) return new SimpleDateFormat("yyyyMMddHHmmss");
    // you got a bad input...
}

注意这些不是线程安全的,所以你应该每次都创建一个新的。

答案 2 :(得分:2)

我会使用SimpleDateFormat类,并根据字符串的长度填充格式模式。除非你有一天有相同长度的字符串,否则这样可以正常工作。

使用您问题中的示例:

格式化2011年7月11日:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date parsedDate = dateFormat.parse("20110711");

格式化2011年7月11日1340hrs:

dateFormat = new SimpleDateFormat("yyyyMMddHHmm");
parsedDate = dateFormat.parse("201107111340");

格式化2011年7月11日1340hrs 10秒:
(注意:小秒数秒,大写S表示毫秒!)

dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
parsedDate = dateFormat.parse("20110711134010");

请参阅超链接以获取格式模式字母的完整列表。

答案 3 :(得分:0)

你仍然可以使用“专门的”解析器(如你所建议的)并链接它们: 例如,您仍然可以拥有DateHourMinSecParseryyyyMMddHHmmSS),DateHourMinParseryyyyMMddHHmm}和DateParseryyyyMMdd )所有这些都实现了相同的接口:

public interface GenericDateParser {
 Date parseDate(String input) throws IllegalArgumentException;
}

e.g。

public class DateHourMinSecParser implements GenericDateParser {
...
     public Date parseDate(String input) throws IllegalArgumentException {
     ...
     }
}

但是这些类中的每一个实际上都会接受一个参数另一个GenericDateParser - 这个想法是每个解析器首先尝试解析日期本身,如果解析(或一些内部检查 - 例如字符串长度)失败它会然后将它传递给链中的下一个解析器,直到链中没有更多的解析器(在这种情况下,它将抛出异常,或者链中的一个成员将返回一个值):

public class DateHourMinSecParser implements GenericDateParser {
     private GenericDateParser chained;

     public DateHourMinSecParser(GenericDateParser chained) {
       this.chained = chained;
     }

     public Date parseDate(String input) throws IllegalArgumentException {
      if( !internalChecks() ) { //chain it up
       if( chained == null ) throw new IllegalArgumentException( "Don't know how to parse " + input);
      }
      //internal checks passed so try to parse it and return a Date or throw exception
      ...
     }
}

你会初始化它们:

GenericDateParser p = new DateHourMinSecParser( new DateHourMinParser(new DateParser(null)) );

然后只使用顶级:

Date d = p.parse( '20110126' );

答案 4 :(得分:-1)

您可以使用DateFormatter从字符串中解析Date。

import java.util.*;
import java.text.*;

public class StringToDate
{
 public static void main(String[] args) 
 {
 try 
 {  
   String str_date="11-June-07";
   DateFormat formatter ; 
   Date date ; 
   formatter = new SimpleDateFormat("yyyy-MM-dd");
   date = (Date)formatter.parse(str_date);  

  } 
  catch (ParseException e)
  {
    System.out.println("Exception :"+e);  
  }  
 }
} 

您可以根据自己的需要更改模式。