Java 如何将不明确的字符串解析为日期?

Java 如何将不明确的字符串解析为日期?,java,string,parsing,date,Java,String,Parsing,Date,我试图找出一种将字符串解析为日期对象的“简单”方法 字符串可以是yyyyMMdd、yyyyMMddHHmm或yyyyymmddhhmms 目前,我正在查看字符串的长度,并根据长度创建DateParser。有没有更优雅的方法来实现这一点?我会使用一个类,并根据字符串的长度填充格式模式。除非有一天你有同样长度的琴弦,否则那就行了 使用问题中的示例: 2011年7月11日: SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

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

字符串可以是yyyyMMdd、yyyyMMddHHmm或yyyyymmddhhmms

目前,我正在查看字符串的长度,并根据长度创建DateParser。有没有更优雅的方法来实现这一点?

我会使用一个类,并根据字符串的长度填充格式模式。除非有一天你有同样长度的琴弦,否则那就行了

使用问题中的示例:

2011年7月11日:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date parsedDate = dateFormat.parse("20110711");
格式2011年7月11日1340小时:

dateFormat = new SimpleDateFormat("yyyyMMddHHmm");
parsedDate = dateFormat.parse("201107111340");
格式2011年7月11日1340小时10秒:
(注意,小s代表秒,大写s代表毫秒!)


有关格式样式字母的完整列表,请参见超链接

您可以使用DateFormatter从字符串中解析日期

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

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

我会像您一样,查看字符串的长度,并创建适当的实例

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...
}
注意:这些不是线程安全的,所以每次都应该创建一个新的。您仍然可以使用“专用”解析器(如您所建议的)并链接它们: 例如,您仍然可以有一个
DateHourMinSecParser
(对于
yyyymmddhhms
),一个
DateHourMinParser
(对于
yyyyMMddHHmm
)和一个
DateParser
),它们都实现了相同的接口:

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

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

您将初始化它们:

GenericDateParser p = new DateHourMinSecParser( new DateHourMinParser(new DateParser(null)) );
然后只需使用最高级的一个:

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

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

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

类似的问题您能提供一个例子吗?代码应该是什么样的?
newsimpledateformat(“YYYYMMDD”)
或`newsimpledateformat(“YYYYMMDDHHMMSS”)?
GenericDateParser p = new DateHourMinSecParser( new DateHourMinParser(new DateParser(null)) );
Date d = p.parse( '20110126' );
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")));