寫一個優雅的時間工具類
阿新 • • 發佈:2022-05-30
第一種方法,將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) throwsParseException { return sdkThreadLocal.get().parse(stringDate); } public static final void remove(){ sdkThreadLocal.remove(); }
第四種方法,DateTimeFormatter,也是阿里手冊上推薦的使用的
public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_DATE_TIME; publicstatic String format(LocalDateTime localDateTime){ return DATE_TIME_FORMATTER.format(localDateTime); }