java工具類-日期工具類
阿新 • • 發佈:2018-12-05
1、獲得時間戳
為了統一其他語言的如php和unix系統獲取的時間戳是10位長度的,精確到秒。
java時間戳長度是13位,精確到毫秒 我們獲取時間戳需要相應處理。
//獲取當前時間戳,除以1000,獲取到長度為10位的,精確到秒 public static long now() { return System.currentTimeMillis() / 1000; }2、時間戳轉化為固定模式的日期yyyy-MM-dd HH:mm:ss 兩種時間戳轉換為日期的方法,發現testTime方法比較快。 testTime2將long轉換為字串加0後,再轉為long,需要時間比較久。
public static String testTime(String pattern, long3日期轉換為時間戳 先將日期字串轉為Date物件,再用Date.getTime()獲取時間戳timestamp) { SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.SIMPLIFIED_CHINESE); return format.format(timestamp * 1000); } public static String testTime2(String pattern, long timestamp) { SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.SIMPLIFIED_CHINESE);return format.format(Long.parseLong(String.valueOf(timestamp) + "000")); }
public static String datePattern = "yyyy-MM-dd"; public static String timeStampPattern = "yyyy-MM-dd HH:mm:ss"; publicstatic Date toDate(String dateStr) { if (StrKit.isBlank(dateStr)) { return null; } dateStr = dateStr.trim(); int length = dateStr.length(); try { if (length == timeStampPattern.length()) { SimpleDateFormat sdf = new SimpleDateFormat(timeStampPattern); try { return sdf.parse(dateStr); } catch (ParseException e) { dateStr = dateStr.replace(".", "-"); dateStr = dateStr.replace("/", "-"); return sdf.parse(dateStr); } } else if (length == datePattern.length()) { SimpleDateFormat sdfDate = new SimpleDateFormat(datePattern); try { return sdfDate.parse(dateStr); } catch (ParseException e) { dateStr = dateStr.replace(".", "-"); dateStr = dateStr.replace("/", "-"); return sdfDate.parse(dateStr); } } else { throw new IllegalArgumentException("The date format is not supported for the time being"); } } catch (ParseException e) { throw new IllegalArgumentException("The date format is not supported for the time being"); } }
測試程式碼如下
Date obtain = toDate("2017-12-10"); long ss = obtain.getTime(); String dateStr = timestamp2DateTime("yyyy-MM-dd HH:mm:ss", ss); System.out.println(dateStr); 結果2017-12-10 00:00:00
下面是廢話
前端用js的Date物件的Date.getTime()方法獲取到的時間戳是13位長度的,精確到毫秒,一般需要進行轉換成精確度到秒。即除以1000 #時間戳轉日期 一般時間戳都是精確到毫秒 預設的時間戳轉日期的方法。 這個方法是呼叫的SimpleDateFormat只有一個引數的構造方法獲得格式轉換物件 這個方法會讓我們對時間格式時區掌控,當系統所在時區發生變化時,日期格式也會發生變化
public static String timestamp2DateTime(String pattern, long timestamp) { SimpleDateFormat format = new SimpleDateFormat(pattern); return format.format(timestamp); }上面的SimpleDateFormat(pattern) 預設會指定當前執行環境所在時區為構造方法,這種不確定性的預設應該需要避免
public SimpleDateFormat(String pattern) { this(pattern, Locale.getDefault(Locale.Category.FORMAT)); }我們自己指定需要轉換的時區 獲取到Locale,即指定國家的時間,這裡是獲得簡體中文,北京時間也就是東八區的locale物件 Locale simpleChinese = new Locale("zh","CN"); Locale.SIMPLIFIED_CHINESE
/** * 時間戳轉化為北京時間日期格式 * @param pattern * 如:yyyy-MM-dd HH:mm:ss 獲取時間格式為: 年-月-日 時:分:秒<br> * pattern模式匹配語法: G 年代標誌符<br> y 年<br> M 月<br> d 日<br> h 時 在上午或下午 (1~12)<br> H 時 在一天中 (0~23)<br> m 分<br> s 秒<br> S 毫秒<br> E 星期<br> D 一年中的第幾天<br> F 一月中第幾個星期幾<br> w 一年中第幾個星期<br> W 一月中第幾個星期<br> a 上午 / 下午 標記符<br> k 時 在一天中 (1~24)<br> K 時 在上午或下午 (0~11)<br> z 時區<br> * @param timestamp * 時間戳 * @return */ public static String timestamp2DateTime(String pattern, long timestamp) { //使用簡體中文所在的時區 SimpleDateFormat format = new SimpleDateFormat(pattern,Locale.SIMPLIFIED_CHINESE); return format.format(timestamp); }
時間更精確的值 1秒 = 1 X 10E15(次方)飛秒 = 1 X 10E12 皮秒 = 1 X 10E9 納秒 = 1 X 10E6 微妙 = 1 X 10E3 毫秒 1秒 = 1000000000000000飛秒 = 1000000000000皮秒 = 1000000000納秒 = 1000000微秒 = 1000毫秒 1秒 = 1000000000000皮秒 = 1000000000納秒 = 1000000微秒 = 1000毫秒 1秒 = 1000000000納秒 = 1000000微秒 = 1000毫秒 1秒 = 1000000微秒 = 1000毫秒 1秒 = 1000毫秒 #納秒 1秒等於10的9次方納秒 這個納秒只能用來精確統計程式執行的時間,比如計算一個程式執行的時間長短,需要一定的準確度。用currentTimeMillis()只能精確到毫秒 System.currentTimeMillis()起始時間是基於1970.1 10:00:00這個
前段時間專案中需要 統計介面連線時間,考慮到連線時間一般都是零點幾毫秒級別的,為了拿到更精確地數值,沒有使用System.currentTimeMillis(),而是貿然地使用System.nanoTime()來統計時間,後來分析伺服器上的資料,發現 竟然有10-15%的資料數值竟然超過了 10的13次方。 原因: System.currentTimeMillis() 起始時間是基於 1970.1.1 0:00:00 這個確定的時間的,而System.nanoTime()是基於cpu核心的時鐘週期來計時,它的開始時間是不確定的。(有篇文章說是根據cpu核心的啟動時間開始計算的) 但是在多核處理器上,由於每個核心的開始時間不確定,但是在多核處理器上, long start = System.nanoTime();String ip = Utilities.getIpByUrl(url);long cost = System.nanoTime() - start; 這段程式碼有可能會執行在兩個不同的cpu核心上,從而導致得到的結果完全不符邏輯。這是測試納秒的時間間隔的測試方法 60萬次資料進行測試,600萬資料太大,文字檔案打不開,看來要重新安裝nodepad++才好。
File tmpFile = new File("D:/testNanoTime.txt"); FileWriter write = null; try { write = new FileWriter(tmpFile); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } int size = 600000; long[] timeStamp = new long[size]; for (int i = 0; i < size; i++) { timeStamp[i] = System.nanoTime(); } long increase = 0l; for (int i = 0; i < size - 1; i++) { increase = timeStamp[i + 1] - timeStamp[i]; if (increase > 0) { // System.out.println("第" + i+1 + "個:"+timeStamp[i + 1]+"第" + i + "個:"+timeStamp[i]+"差值"+increase); try { write.write("第" + i+1 + "個:"+timeStamp[i + 1]+"第" + i + "個:"+timeStamp[i]+"差值"+increase+"\n"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } increase = 0; } try { write.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("操作完成");