SimpleDateFormat解析exepiton和替代方法的区别

时间:2018-10-31 10:35:53

标签: java multithreading date simpledateformat

private final static SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("ddMMMyy", Locale.ENGLISH);  //method 1

private static  Date getSimpleDate(String sDate) throws ParseException{
    SimpleDateFormat F = new  SimpleDateFormat("ddMMMyy", Locale.ENGLISH);
    System.out.println("pDAte:"+ F.parse(sDate).toString());
    return F.parse(sDate);
} //[method 2]


private static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() { 
    @Override
    protected SimpleDateFormat initialValue() {
        return new SimpleDateFormat("ddMMMyy", Locale.ENGLISH);// [method 3]
    }
};  //method3

private final static DateTimeFormatter DATE_FORMATTER = 
        new DateTimeFormatterBuilder().parseCaseInsensitive()
                                      .appendPattern("ddMMMyy")
                                      .toFormatter();  //[method 4]

当我使用方法1解析日期时,我遇到了更多的异常,

java.lang.NumberFormatException: For input at 
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

java.lang.NumberFormatException: For input string: ".1818E2.1818E2" 
            at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)

首先我的问题:这个值“ .1818E2.1818E2”我没有设置这个值,但是我面对。价值在哪里?尽管我以正确的格式设置日期值的正确方法,但我仍然遇到此问题。

但是其他方法(method2,method3,method4)也可以使用。解决了问题这三种方法都包括替代解决方案。 其次,我的问题是,这种方法的区别是什么?

public Date getDscDateAsDate() throws ParseException {
    if(getDscDate()!=null) {
        return SIMPLE_DATE_FORMAT.parse(getDscDate());
    }
    return null;                
}

1 个答案:

答案 0 :(得分:3)

SimpleDateFormat不是线程安全的:

Why is Java's SimpleDateFormat not thread-safe?

"Java DateFormat is not threadsafe" what does this leads to?

在方法1中,您在多个线程中使用SimpleDateFormat实例,这些线程可能同时设置此SimpleDateFormat的某些字段,从而产生无效的中间结果,例如.1818E2.1818E2。您可以检查此异常的完整堆栈跟踪,以获取更多信息。

在方法2和方法3中,每个线程都有自己的SimpleDateFormat实例。这样就可以了

在方法4中,您正在使用DateTimeFormatter,它是线程安全的。