SimpleDateFormat 解析异常和替代方法的区别
SimpleDateFormat parse excepiton and alternative methods differences
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;
}
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
,它是线程安全的。
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;
}
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
,它是线程安全的。