摘要: 原創出處:www.bysocket.com 泥瓦匠BYSocket 但願轉載,保留摘要,謝謝!java
「知識的工做者必須成爲本身時間的首席執行官。」git
此次泥瓦匠帶來的是一個好玩的基於 JDK 8 time包的時間工具類 TimeUtil。本意,用 JDK 8 寫個實戰的時間工具類,第一版泥瓦匠寫的很很差,後來雨神分分鐘將這個代碼優化優化,謝謝雨神。就此分享下這個代碼,讓更多的人看到~程序員
從 Java 1.0 有個 Date 類,想必你們不陌生,後面有了 Calendar 類(被廢棄 )。API 確實比較難用,所以 Java 8 引入 java.time API,此次看看是否是很好用。大體引入了這幾個對象:github
本小文重點仍是在使用 LocalDateTime 及其格式化類 DateTimeFormatter。api
LocalDateTime 表示一個日期和時間,存儲肯定時區中的某個時間點。
例如某一次練書法彈琴活動。(ps:泥瓦匠有個小圈子,裏面喜歡加入一些文藝的程序員。愛技術,愛生活,愛藝術~ 雨神就愛彈琴,日語思密達*&#@#% )socket
經常使用api:函數
DateTimeFormatter 用於格式化時間,提供了公用的方法入口,打印和解析格式化的時間類。工具
經常使用api:測試
泥瓦匠一一道來這個代碼的實現。先看代碼:優化
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * 基於 JDK 8 time包的時間工具類 * <p/> * Created by bysocket on 16/8/23. */ public final class TimeUtil { /** * 獲取默認時間格式: yyyy-MM-dd HH:mm:ss */ private static final DateTimeFormatter DEFAULT_DATETIME_FORMATTER = TimeFormat.LONG_DATE_PATTERN_LINE.formatter; private TimeUtil() { // no construct function } /** * String 轉時間 * * @param timeStr * @return */ public static LocalDateTime parseTime(String timeStr) { return LocalDateTime.parse(timeStr, DEFAULT_DATETIME_FORMATTER); } /** * String 轉時間 * * @param timeStr * @param format 時間格式 * @return */ public static LocalDateTime parseTime(String timeStr, TimeFormat format) { return LocalDateTime.parse(timeStr, format.formatter); } /** * 時間轉 String * * @param time * @return */ public static String parseTime(LocalDateTime time) { return DEFAULT_DATETIME_FORMATTER.format(time); } /** * 時間轉 String * * @param time * @param format 時間格式 * @return */ public static String parseTime(LocalDateTime time, TimeFormat format) { return format.formatter.format(time); } /** * 獲取當前時間 * * @return */ public static String getCurrentDatetime() { return DEFAULT_DATETIME_FORMATTER.format(LocalDateTime.now()); } /** * 獲取當前時間 * * @param format 時間格式 * @return */ public static String getCurrentDatetime(TimeFormat format) { return format.formatter.format(LocalDateTime.now()); } /** * 時間格式 */ public enum TimeFormat { /** * 短期格式 */ SHORT_DATE_PATTERN_LINE("yyyy-MM-dd"), SHORT_DATE_PATTERN_SLASH("yyyy/MM/dd"), SHORT_DATE_PATTERN_DOUBLE_SLASH("yyyy\\MM\\dd"), SHORT_DATE_PATTERN_NONE("yyyyMMdd"), /** * 長時間格式 */ LONG_DATE_PATTERN_LINE("yyyy-MM-dd HH:mm:ss"), LONG_DATE_PATTERN_SLASH("yyyy/MM/dd HH:mm:ss"), LONG_DATE_PATTERN_DOUBLE_SLASH("yyyy\\MM\\dd HH:mm:ss"), LONG_DATE_PATTERN_NONE("yyyyMMdd HH:mm:ss"), /** * 長時間格式 帶毫秒 */ LONG_DATE_PATTERN_WITH_MILSEC_LINE("yyyy-MM-dd HH:mm:ss.SSS"), LONG_DATE_PATTERN_WITH_MILSEC_SLASH("yyyy/MM/dd HH:mm:ss.SSS"), LONG_DATE_PATTERN_WITH_MILSEC_DOUBLE_SLASH("yyyy\\MM\\dd HH:mm:ss.SSS"), LONG_DATE_PATTERN_WITH_MILSEC_NONE("yyyyMMdd HH:mm:ss.SSS"); private transient DateTimeFormatter formatter; TimeFormat(String pattern) { formatter = DateTimeFormatter.ofPattern(pattern); } } }
聲明瞭默認的 DateTimeFormatter 時間格式:yyyy-MM-dd HH:mm:ss。其餘則是提供了 獲取當前時間 和 時間與String互轉的方法。工具類由 final TimeUtil類 及 其內部枚舉類TimeFormat時間格式類 組成。
1/ TimeUtil 具備私有構造函數,表示被保護,沒法被外部 new 出實例。
2/ TimeFormat 內部枚舉類,首先它是單例的。
transient 關鍵字目的是確保 DateTimeFormatter 無序列化存儲。爲啥單例,由於 DateTimeFormmatter 是無狀態的,能夠線程共享。
具體方法解析以下:
1. 獲取當前時間
1 2 3 4 |
|
2. 獲取當前相應格式的當前時間
1 2 3 4 |
|
3. String 轉時間
默認格式:yyyy-MM-dd HH:mm:ss
1 2 3 |
|
其餘格式之一:yyyy-MM-dd HH:mm:ss
1 2 3 |
|
4. 時間轉 String
默認格式:yyyy-MM-dd HH:mm:ss
1 2 |
|
其餘格式之一:yyyy-MM-dd HH:mm:ss
1 2 |
|
java.time 類與 Old Date 代碼互操做以下圖:
實戰中的 JDK8 ,Show the code。 在用的項目,完善測試時候用起來纔是關鍵。天然須要 JDK 環境支持,升級吧升級吧。
基於 JDK 8 time包的實踐,此次只講了 LocalDateTime 類,慢慢帶來更多。
相關代碼分享在 Github 主頁
如以上文章或連接對你有幫助的話,別忘了在文章結尾處評論哈~ 你也能夠點擊頁面右邊「分享」懸浮按鈕哦,讓更多的人閱讀這篇文章。