我同意Kragen的观点,即在一般情况下没有正确的解决方案。但是,如果以下情况成立,您可以使用以下解决方案:
您有一组所有可能的格式
格式之间没有歧义;其中两个表达式无法成功解析任何日期表达式。
请考虑以下解决方案,该解决方案循环访问可能的格式列表。此解决方案利用 ThreadLocal
,以便在多线程环境中有效地解析日期(请记住,这不是线程安全的):SimpleDateFormat
public class FlexibleDateParser {
private List<ThreadLocal<SimpleDateFormat>> threadLocals = new ArrayList<ThreadLocal<SimpleDateFormat>>();
public FlexibleDateParser(List<String> formats, final TimeZone tz){
threadLocals.clear();
for (final String format : formats) {
ThreadLocal<SimpleDateFormat> dateFormatTL = new ThreadLocal<SimpleDateFormat>() {
protected SimpleDateFormat initialValue() {
SimpleDateFormat sdf = new SimpleDateFormat(format);
sdf.setTimeZone(tz);
sdf.setLenient(false);
return sdf;
}
};
threadLocals.add(dateFormatTL);
}
}
public Date parseDate(String dateStr) throws ParseException {
for (ThreadLocal<SimpleDateFormat> tl : threadLocals) {
SimpleDateFormat sdf = tl.get();
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
// Ignore and try next date parser
}
}
// All parsers failed
return null;
}
}