众所周知,由于SimpleDateFormat是线程不安全的,如果使用不当会导致异常或错误,所以我使用ThreadLocal来确保每个访问的线程都持有一个map,map中保存着 格式->对象 的键值对,从而保证线程的安全性。
public class DateFormatUtil {
public static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";
private static ThreadLocal<Map<String, SimpleDateFormat>> threadLocal = new ThreadLocal<Map<String, SimpleDateFormat>>();
public static SimpleDateFormat getSimpleDateFormat(String pattern) {
return getSimpleDateFormat(pattern, Locale.getDefault());
}
public static SimpleDateFormat getSimpleDateFormat(String pattern,
Locale locale) {
Map<String, SimpleDateFormat> formatMap = threadLocal.get();
SimpleDateFormat format = null;
if (formatMap == null) {
formatMap = new HashMap<String, SimpleDateFormat>();
format = new SimpleDateFormat(pattern, locale);
formatMap.put(pattern, format);
threadLocal.set(formatMap);
} else {
format = formatMap.get(pattern);
if (format == null) {
format = new SimpleDateFormat(pattern, locale);
formatMap.put(pattern, format);
}
}
return format;
}
public static Date parse(String str) throws ParseException {
return getSimpleDateFormat(DEFAULT_PATTERN).parse(str);
}
public static String format(Date date) throws ParseException {
return getSimpleDateFormat(DEFAULT_PATTERN).format(date);
}
}