最近項目一直會出現時間轉換報錯,一直不知道是什么問題???
?
java.lang.NumberFormatException: multiple pointsat sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1110)at java.lang.Double.parseDouble(Double.java:540)at java.text.DigitList.getDouble(DigitList.java:168)at java.text.DecimalFormat.parse(DecimalFormat.java:1321)at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1793)at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455)
?
代碼如下:
public final class DateUtil {private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");public static Date parseDateTime(String dateTimeStr) {try {return dateFormat.parse(dateTimeStr);} catch (ParseException e) {// TODO Auto-generated catch block e.printStackTrace();}return null;}}
?
如果是上述代碼,那么在多線程環境下,你可能會收到如標題所示的錯誤。
解決辦法
1、建議在每個方法中都new一個新的SimpleDateFormat對象,這樣子就可以避免這種問題。
2、也可以使用保存線程局部變量的ThreadLocal對象來保存每一個線程的SimpleDateFormat對象。
?
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class DateUtils {private static final String format = "yyyy-MM-dd";//每一個線程private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>();public static Date covertDateStrToDate(String dateStr){SimpleDateFormat sdf = null;sdf = threadLocal.get();if (sdf == null){sdf = new SimpleDateFormat(format);}// Date date = null;try {System.out.println("當前線程為:" + Thread.currentThread().getName());date = sdf.parse(dateStr);} catch (ParseException e) {e.printStackTrace();}return date;} }
?