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

我试图找出一种将String解析为Date对象的“简单”方法。

String可以是yyyyMMdd,yyyyMMddHHmm或yyyyMMddHHmmSS。

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

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

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

我会照原样,查看字符串的长度,并创建一个合适的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... } 

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

我会使用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"); 

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

您仍然可以使用“专用”解析器(如您所建议的那样)并链接它们:例如,您仍然可以使用DateHourMinSecParser (对于yyyyMMddHHmmSS ), DateHourMinParser (对于yyyyMMddHHmm )和DateParser (对于yyyyMMdd ),所有这些都实现相同接口:

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

例如

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

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

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

您可以使用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); } } } 

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