1. 程式人生 > >SimpleDateFormat時間格式化高併發、多執行緒時出現問題

SimpleDateFormat時間格式化高併發、多執行緒時出現問題

SimpleDateFormat是是 Java 中一個非常常用的類,該類用來對日期字串進行解析和格式化輸出,但是DateFormat 和 SimpleDateFormat 類不都是執行緒安全的,在生產環境的多執行緒或高併發情況使用 format() 和 parse() 方法,會出現很多問題:
比如格式化後的時間跟期望格式化的時間不一致,或者出現一些其他的像Exception in thread “Thread-1” java.lang.NumberFormatException: multiple points的異常錯誤,為了解決這種問題可以在需要的時候建立新例項或者使用同步鎖:

1、新建例項

public class DateUtils {
	//整合日期轉換

	public static final DateFormat taobaoDF = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");
	public static final DateFormat normalDF = new SimpleDateFormat("yyyy-MM-dd");	
	/**
	 * 入參日期格式轉換為系統預設的日期格式
	 * 
	 * @param strTaobaoDate
	 * @return
	 * @throws Exception
	 */
	public static String format(String strTaobaoDate) throws Exception {

		String strResult = "";
		DateFormat normalDF = new SimpleDateFormat("yyyy-MM-dd");
		DateFormat taobaoDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = null;
		try {	
				date = taobaoDF.parse(strTaobaoDate);
				strResult = normalDF.format(date);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception(
					"日期格式不正確,日期格式如下:yyyy-MM-dd HH:mm:ss 例:2014-01-01 00:00:00");
		}
		return strResult;
	}
	}

2、使用同步鎖

public class DateUtils {
	public static final DateFormat taobaoDF = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");
	public static final DateFormat normalDF = new SimpleDateFormat("yyyy-MM-dd");
	
	/**
	 * 入參日期格式轉換為系統預設的日期格式
	 * 
	 * @param strTaobaoDate
	 * @return
	 * @throws Exception
	 */
	public static String format(String strTaobaoDate) throws Exception {

		String strResult = "";
		Date date = null;
		try {	
			synchronized(taobaoDF){
				date = taobaoDF.parse(strTaobaoDate);
			}
			synchronized(normalDF){
				strResult = normalDF.format(date);
			}

		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception(
					"日期格式不正確,日期格式如下:yyyy-MM-dd HH:mm:ss 例:2014-01-01 00:00:00");
		}
		return strResult;
	}

網上還有一些其它解決方案與原因說明,可以看:https://www.cnblogs.com/zhuimengdeyuanyuan/archive/2017/10/25/7728009.html