1. 程式人生 > >SimpleDateFormat的使用 時間差的計算 SimpleDateFormat 轉換格式異常(執行緒安全問題)

SimpleDateFormat的使用 時間差的計算 SimpleDateFormat 轉換格式異常(執行緒安全問題)

基本格式:

SimpleDateFormat simpleFormat = new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss");

執行緒安全問題分析

SimpleDateFormat 的變數若是一個靜態變數,並在不同的執行緒中使用,就有可能造成轉換格式異常的問題(例如轉換年月日時分就有可能出現2018-07-05 0009:50 情況,轉換年月日就可能出現2018-06-0015現象),這種情況是由於多個執行緒同時使用SimpleDateFormat物件造成的,而這種情況是由於SimpleFormat內部是由一個Calendar控制的,當SimpleDateFormat靜態時,Calendar也就被共享了,多個執行緒同時操作Calendar就會出現問題。

解決辦法

一、每個執行緒擁有自己的SimpleDateFormat物件,即每個執行緒使用sdf物件時就new 一個新的。(浪費資源)

二、對使用Sdf的執行緒加鎖,使sdf的使用只能同步進行(耗時)

三、使用執行緒安全的時間轉換 FastDateFormat  org.apache.commons.lang3.time包

四、使用ThreadLocal:

參考:

https://blog.csdn.net/zdp072/article/details/41044059

https://www.cnblogs.com/zemliu/archive/2013/08/29/3290585.html

https://www.cnblogs.com/lion88/p/6426019.html

FaseDateFormat的參考:

https://blog.csdn.net/insistgogo/article/details/22393441

ThreadLocal的參考:

https://mp.csdn.net/postedit

https://www.jb51.net/article/109562.htm

https://segmentfault.com/a/1190000011264294

時間差的計算

SimpleDateFormat simpleFormat = new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss");
try {
Date xdsj = (Date) simpleFormat.parse("2017-09-18 10:10:30");
Date jzsj = (Date) simpleFormat.parse("2017-09-20 16:30:10");
long xdsjKs = xdsj.getTime();
long jzsjJs = jzsj.getTime();
long sjc = jzsjJs - xdsjKs;
int day = (int) (sjc / (1000 * 60 * 60 * 24));// 剩餘的天數
int hour = (int) ((sjc % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));// 剩餘的小時數
int minute = (int) (((sjc % (1000 * 60 * 60 * 24)) % (1000 * 60 * 60)) / (1000 * 60));// 剩餘的分鐘數
int second = (int) ((((sjc % (1000 * 60 * 60 * 24)) % (1000 * 60 * 60)) % (1000 * 60)) / 1000);
System.out.println("天:" + day + "小時:" + hour + "分鐘:" + minute
+ "秒:" + second);
} catch (ParseException e) {
e.printStackTrace();
}

SimpleDateFormat simpleFormat = new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss");