写一个优雅的时间工具类
第一种方法,将SimpleDateFormat定义为静态方法,但是在多线程的环境下回出现错误,如下:
根据源码分析我们得知
SimpleDateFormat类内部有一个Calendar对象引用,它用来储存和这个SimpleDateFormat相关的日期信息,例如sdf.parse(dateStr),sdf.format(date) 诸如此类的方法参数传入的日期相关String,Date等等, 都是交由Calendar引用来储存的.这样就会导致一个问题如果你的SimpleDateFormat是个static的, 那么多个thread 之间就会共享这个SimpleDateFormat, 同时也是共享这个Calendar引用。
第二种方法,将SimpleDateFormat定义成局部变量;每调用一次方法就会创建一个SimpleDateFormat对象,方法结束又要作为垃圾回收。
第三种方法,使用ThreadLocal
public static final ThreadLocalsdkThreadLocal = ThreadLocal.withInitial(()-> new SimpleDateFormat("yyyy-MM-dd")); public static final Date parseByThreadLocal(String stringDate) throws ParseException { return sdkThreadLocal.get().parse(stringDate); } public static final void remove(){ sdkThreadLocal.remove(); }
第四种方法,DateTimeFormatter,也是阿里手册上推荐的使用的
public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_DATE_TIME; public static String format(LocalDateTime localDateTime){ return DATE_TIME_FORMATTER.format(localDateTime); }