代碼片斷:基於 JDK 8 time包的時間工具類 TimeUtil

摘要: 原創出處:www.bysocket.com 泥瓦匠BYSocket 但願轉載,保留摘要,謝謝!java

「知識的工做者必須成爲本身時間的首席執行官。」git

前言

此次泥瓦匠帶來的是一個好玩的基於 JDK 8 time包的時間工具類 TimeUtil。本意,用 JDK 8 寫個實戰的時間工具類,第一版泥瓦匠寫的很很差,後來雨神分分鐘將這個代碼優化優化,謝謝雨神。就此分享下這個代碼,讓更多的人看到~程序員

1、 Java 8 time包

從 Java 1.0 有個 Date 類,想必你們不陌生,後面有了 Calendar 類(被廢棄 )。API 確實比較難用,所以 Java 8 引入 java.time API,此次看看是否是很好用。大體引入了這幾個對象:github

  • Instant – 瞬間類,表示時間線上的一點(與 Date 相似)
  • Duration – 持續時間,表示兩個 Instant 之間的時間
  • LocalDateTime – 本地日期時間,表示一個日期和時間。

本小文重點仍是在使用 LocalDateTime 及其格式化類 DateTimeFormatterapi

2、介紹 LocalDateTime & DateTimeFormatter APIs

LocalDateTime 表示一個日期和時間,存儲肯定時區中的某個時間點。
例如某一次練書法彈琴活動。(ps:泥瓦匠有個小圈子,裏面喜歡加入一些文藝的程序員。愛技術,愛生活,愛藝術~ 雨神就愛彈琴,日語思密達*&#@#% )socket

經常使用api:函數

  • now()
    從系統中獲取當前時間
  • parse(CharSequence text, DateTimeFormatter formatter)
    從字符串按格式獲取 LocalDateTime 實例

DateTimeFormatter 用於格式化時間,提供了公用的方法入口,打印和解析格式化的時間類。工具

經常使用api:測試

  • format(TemporalAccessor temporal)
    按格式格式化時間
  • ofPattern(String pattern)
    按字符串指定的格式,生成時間格式

 

3、TimeUtil 代碼詳解

泥瓦匠一一道來這個代碼的實現。先看代碼:優化

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

String now = TimeUtil.getCurrentDatetime();

System.out.println(now);

output:

2016-08-28 16:35:23

2. 獲取當前相應格式的當前時間

1

2

3

4

String now = TimeUtil.getCurrentDatetime(TimeUtil.TimeFormat.LONG_DATE_PATTERN_SLASH);

System.out.println(now);

output:

2016/08/28 16:36:24

3. String 轉時間
默認格式:yyyy-MM-dd HH:mm:ss

1

2

3

LocalDateTime expectedDateTime = LocalDateTime.of(2014, 11, 11, 10, 11, 11);

LocalDateTime parsedTime = TimeUtil.parseTime("2014-11-11 10:11:11");

assertEquals(expectedDateTime, parsedTime);

其餘格式之一:yyyy-MM-dd HH:mm:ss

1

2

3

LocalDateTime expectedDateTime = LocalDateTime.of(2014, 11, 11, 10, 11, 11);

LocalDateTime parsedTime = TimeUtil.parseTime("2014/11/11 10:11:11", LONG_DATE_PATTERN_SLASH);

assertEquals(expectedDateTime, parsedTime);

4. 時間轉 String
默認格式:yyyy-MM-dd HH:mm:ss

1

2

LocalDateTime time = LocalDateTime.of(2014, 11, 11, 10, 11, 11);

assertEquals(TimeUtil.parseTime(time), "2014-11-11 10:11:11");

其餘格式之一:yyyy-MM-dd HH:mm:ss

1

2

LocalDateTime time = LocalDateTime.of(2014, 11, 11, 10, 11, 11);

assertEquals(TimeUtil.parseTime(time, LONG_DATE_PATTERN_DOUBLE_SLASH), "2014\\11\\11 10:11:11");

 

4、與 Old 代碼互操做

java.time 類與 Old Date 代碼互操做以下圖:

time

 

5、小結

實戰中的 JDK8 ,Show the code。 在用的項目,完善測試時候用起來纔是關鍵。天然須要 JDK 環境支持,升級吧升級吧。
基於 JDK 8 time包的實踐,此次只講了 LocalDateTime 類,慢慢帶來更多。
相關代碼分享在 Github 主頁

如以上文章或連接對你有幫助的話,別忘了在文章結尾處評論哈~ 你也能夠點擊頁面右邊「分享」懸浮按鈕哦,讓更多的人閱讀這篇文章。

相關文章
相關標籤/搜索