最近項目一直會出現時間轉換報錯,一直不知道是什么問題???
java.lang.NumberFormatException: multiple points at 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; } }