Java SimpleDateFormat不会抛出ParseException

时间:2014-05-26 15:39:15

标签: java parsing date simpledateformat date-parsing

我想要解析一些日期..我使用以下代码执行此操作:

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

然后它不会抛出异常!

2 个答案:

答案 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;
}