我想要解析一些日期..我使用以下代码执行此操作:
ULocale tmpLocale=Locale.US
try {
return parse(date, "yyyy-MM-dd HH:mm:ss.SSS",tmpLocale);
} catch (ParseException e1) {
try {
return parse(date, "dd.MM.yyyy-HH:mm",tmpLocale);
} catch (ParseException e2) {
try {
return parse(date, "dd.MM.yyyy",tmpLocale);
} catch (ParseException e3) {
try {
return parse(date, "yyyy-MM-dd",tmpLocale);
} catch (ParseException e4) {
try{
return parse(date, "yyyyMMdd",tmpLocale);
}catch(ParseException e5){
throw new DefaultDateParserException();
}
}//e4 catch
}//e3 catch
}//e2 Catch
} //e1 Catch
并且通过此方法完成解析:
private static DateValue parse(String value, String pattern,ULocale locale) throws ParseException {
UFormat uFormat = new SimpleDateFormat(pattern, locale);
((SimpleDateFormat) uFormat).setTimeZone(TimeZone.getTimeZone("GMT"));
((SimpleDateFormat) uFormat).setLenient(false);
Date date = ((SimpleDateFormat) uFormat).parse(value);
GregorianCalendar gc = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
gc.setTime(date);
return new DateValue(gc);
}
要测试是否抛出了异常,我使用此测试值" 2011.10.01" ...上面的代码中没有模式应与此匹配,但异常e4 "解析(日期," yyyyMMdd",tmpLocale);"确实解析了我的约会,为什么会这样? " YYYYMMDD"不应该与这个日期匹配" 2011.10.01" !我怎么能告诉我的解析器他应该只解析模式匹配的日期?
希望你理解我的意思。
编辑:似乎问题是IBM使用的UFormat: 但我不知道为什么它不在那里工作。 @Kyllopardiun 如果你下载这个包 http://mvnrepository.com/artifact/com.ibm.icu/icu4j/4.0.1并将您的导入更改为:
import java.text.ParseException;
import java.util.Date;
import com.ibm.icu.text.SimpleDateFormat;
import com.ibm.icu.util.GregorianCalendar;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.ULocale;
和Local.US到ULocale.US
然后它不会抛出异常!
答案 0 :(得分:0)
首先:解析不应该是静态你可能误解了一些OOP的概念,即调用一个不应该是静态的方法。
Secound:您应始终尝试遵循此网站指南并创建 Minimal Complete Verified Example
我不知道你的班级DateValue
怎么样,因此我无法确定错误是否存在。
您的代码实际上有效:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
public class CalendarFun {
private GregorianCalendar parse(String value, String pattern)
throws ParseException {
SimpleDateFormat uFormat = new SimpleDateFormat(pattern, Locale.US);
((SimpleDateFormat) uFormat).setTimeZone(TimeZone.getTimeZone("GMT"));
((SimpleDateFormat) uFormat).setLenient(false);
Date date = ((SimpleDateFormat) uFormat).parse(value);
GregorianCalendar gc = new GregorianCalendar(
TimeZone.getTimeZone("GMT"));
gc.setTime(date);
return gc;
}
public static void main(String[] argvs) {
GregorianCalendar calendar = new GregorianCalendar();
String date = "2011.10.01";
CalendarFun t = new CalendarFun();
calendar = t.test(date);
date = "10.01.2011";
calendar = t.test(date);
}
public GregorianCalendar test(String date) {
try {
System.out.println("1o try");
return parse(date, "yyyy-MM-dd HH:mm:ss.SSS");
} catch (ParseException e1) {
try {
System.out.println("2nd try");
return parse(date, "dd.MM.yyyy-HH:mm");
} catch (ParseException e2) {
try {
System.out.println("3rd try");
return parse(date, "dd.MM.yyyy");
} catch (ParseException e3) {
try {
System.out.println("4th try");
return parse(date, "yyyy-MM-dd");
} catch (ParseException e4) {
try {
System.out.println("5th try");
return parse(date, "yyyyMMdd");
} catch (ParseException e5) {
System.out.println("error");
}
}// e4 catch
}// e3 catch
}// e2 Catch
}
return new GregorianCalendar();
}
}
答案 1 :(得分:0)
如何定义多个模式?它们可能来自包含已知模式的配置文件,硬编码如下:
private List<SimpleDateFormat> patterns = new ArrayList<SimpleDateFormat>();
patterns.add(new SimpleDateFormat("yyyy-MM-dd"));
patterns.add(new SimpleDateFormat("dd-MM-yyyy"));
patterns.add(new SimpleDateFormat("MM-dd-yyyy"));
patterns.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"));
patterns.add(new SimpleDateFormat("dd.MM.yyyy-HH:mm"));
patterns.add(new SimpleDateFormat("yyyy.MM.dd"));
patterns.add(new SimpleDateFormat("dd.MM.yyyy"));
patterns.add(new SimpleDateFormat("MM.dd.yyyy"));
patterns.add(new SimpleDateFormat("yyyy/MM/dd"));
patterns.add(new SimpleDateFormat("dd/MM/yyyy"));
patterns.add(new SimpleDateFormat("MM/dd/yyyy"));
然后,您可以遍历在List中保存的所有模式。
private Date getDateByPattern() {
String s = "2015-10-05";
for (int i = 0; i < patterns.size(); i++) {
SimpleDateFormat pattern = (SimpleDateFormat) patterns.get(i);
try {
date = pattern.parse(s);
} catch(ParseException e) {
continue;
}
if(date != null) {
System.out.println("pattern: " + pattern.toLocalizedPattern());
System.out.println("parsed date: " + date);
return date;
}
}
return null;
}