采用的版本如下:
commons-lang-2.5.jar
基于commons-lang进行date format的操作代码如下:
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
String pattern = "yyyy-MM-dd hh:mm:ss";
String dateStr = DateFormatUtils.format(calendar, pattern);
Date date = DateUtils.parseDate(dateStr, new String[] {pattern });
LOGGER.info("dateStr:" + dateStr);
LOGGER.info("date:" + date);
考察 DateFormatUtils.format和DateUtils.parseDate是否线程安全的
通过调用FastDateFormat获取format
public static String format(Calendar calendar, String pattern, TimeZone timeZone, Locale locale)
{
FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale);
return df.format(calendar);
}
同步调用getInstance获取实例
public static synchronized FastDateFormat getInstance(String pattern, TimeZone timeZone, Locale locale)
{
FastDateFormat emptyFormat = new FastDateFormat(pattern, timeZone, locale);
FastDateFormat format = (FastDateFormat)cInstanceCache.get(emptyFormat);
if(format == null)
{
format = emptyFormat;
format.init();
cInstanceCache.put(format, format);
}
return format;
}
我们发现如果pattern相同那么获取到的FastDateFormat就一定是相同的,那我们就开始问了,是否他是线程安全的呢?是否线程安全取决于如下信息:
1.static的变量是否都是final的
2.static的变量不是final的时候是否会被修改?
查看源码:
private static final long serialVersionUID = 1L;
public static final int FULL = 0;
public static final int LONG = 1;
public static final int MEDIUM = 2;
public static final int SHORT = 3;
private static String cDefaultPattern;
private static final Map cInstanceCache = new HashMap(7);
private static final Map cDateInstanceCache = new HashMap(7);
private static final Map cTimeInstanceCache = new HashMap(7);
private static final Map cDateTimeInstanceCache = new HashMap(7);
private static final Map cTimeZoneDisplayCache = new HashMap(7);
private final String mPattern;
private final TimeZone mTimeZone;
private final boolean mTimeZoneForced;
private final Locale mLocale;
private final boolean mLocaleForced;
private transient Rule mRules[];
private transient int mMaxLengthEstimate;
我们发现符合线程安全条件,因此他是线程安全的,只不过解析date的时候采用了自己的一套规则