写一个优雅的时间工具类


第一种方法,将SimpleDateFormat定义为静态方法,但是在多线程的环境下回出现错误,如下:

 根据源码分析我们得知

SimpleDateFormat类内部有一个Calendar对象引用,它用来储存和这个SimpleDateFormat相关的日期信息,例如sdf.parse(dateStr),sdf.format(date) 诸如此类的方法参数传入的日期相关String,Date等等, 都是交由Calendar引用来储存的.这样就会导致一个问题如果你的SimpleDateFormat是个static的, 那么多个thread 之间就会共享这个SimpleDateFormat, 同时也是共享这个Calendar引用。

第二种方法,将SimpleDateFormat定义成局部变量;每调用一次方法就会创建一个SimpleDateFormat对象,方法结束又要作为垃圾回收。

第三种方法,使用ThreadLocal

    public static final ThreadLocal sdkThreadLocal = 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);
    }