1. 程式人生 > 其它 >寫一個優雅的時間工具類

寫一個優雅的時間工具類

第一種方法,將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<SimpleDateFormat> 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); }