9

我需要将传入的日期字符串格式“20130212”(YYYYMMDD)转换为 12/02/2013(DD/MM/YYYY)

使用ThreadLocal. 我知道没有ThreadLocal. 谁能帮我?

无转换ThreadLocal

    final SimpleDateFormat format2 = new SimpleDateFormat("MM/dd/yyyy");
    final SimpleDateFormat format1 = new SimpleDateFormat("yyyyMMdd");
    final Date date = format1.parse(tradeDate);
    final Date formattedDate = format2.parse(format2.format(date));
4

2 回答 2

13

这背后的想法是 SimpleDateFormat 不是线程安全的,因此在多线程应用程序中,您不能在多个线程之间共享 SimpleDateFormat 的实例。但是由于创建 SimpleDateFormat 是一项昂贵的操作,我们可以使用 ThreadLocal 作为解决方法

static ThreadLocal<SimpleDateFormat> format1 = new ThreadLocal<SimpleDateFormat>() {
    @Override
    protected SimpleDateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd");
    }
};

public String formatDate(Date date) {
    return format1.get().format(date);
}
于 2013-09-03T10:39:15.230 回答
11

除了编写不可变类之外,Java 中的 ThreadLocal 是一种实现线程安全的方法。由于 SimpleDateFormat 不是线程安全的,因此您可以使用 ThreadLocal 使其成为线程安全的。

class DateFormatter{

    private static ThreadLocal<SimpleDateFormat> outDateFormatHolder = new ThreadLocal<SimpleDateFormat>() {
    @Override
    protected SimpleDateFormat initialValue() {
        return new SimpleDateFormat("MM/dd/yyyy");
    }
};

private static ThreadLocal<SimpleDateFormat> inDateFormatHolder = new ThreadLocal<SimpleDateFormat>() {
    @Override
    protected SimpleDateFormat initialValue() {
        return new SimpleDateFormat("yyyyMMdd");
    }
};

public static String formatDate(String date) throws ParseException { 
    return outDateFormatHolder.get().format(
            inDateFormatHolder.get().parse(date));
}        
}
于 2013-09-03T10:59:43.270 回答