【问题标题】:Java SimpleDateFormat throws no ParseExceptionJava SimpleDateFormat 不抛出 ParseException
【发布时间】:2014-05-26 15:39:15
【问题描述】:

我想解析一些日期.. 我用以下代码做到这一点:

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

那么它不会抛出异常!

【问题讨论】:

  • 我刚刚在这里测试了你的代码,“2011.10.01”一直通过异常 e5。

标签: java parsing date simpledateformat date-parsing


【解决方案1】:

首先:解析不应该是静态的,您可能误解了 OOP 的一些概念来调用不应该是静态的方法。

第二:您始终应尝试遵循本网站指南并创建 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();
    }
}

【讨论】:

  • 嗨,首先感谢您的帮助,看来问题是我使用的 IBM UFormat 我编辑了我的第一篇文章。如果我使用 IBM 包,则不会引发异常。
【解决方案2】:

如果只定义多个模式呢?它们可能来自包含已知模式的配置文件,硬编码如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多