1. 程式人生 > >JDK8之時間線物件Instant

JDK8之時間線物件Instant

JDK8中Instant

前言

如果是 JDK8 的應用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat,官方給出的解釋:simple beautiful strong immutable thread-safe。

Instant詳解

Instant關係圖

  • FunctionalInterface
    主要用在Lambda表示式和方法引用(實際上也可認為是Lambda表示式)上。類似於泛型的用途,可以在編譯期幫我們檢查是否符合函數語言程式設計的規範。
  • TemporalAccessor
    框架級介面定義對時態物件的只讀訪問,例如日期、時間、偏移量或這些物件的某些組合。這是日期、時間和偏移物件的基本介面型別。
  • Comparable
    這個介面對實現它的每個類的物件強制執行總排序。這種排序稱為類的自然排序,類的compareTo方法稱為其自然比較方法.
  • TemporalAdjuster
    調整時間物件的策略。調節器是修改時態物件的關鍵工具。它們的存在是為了使調整過程具體化,允許按照策略設計模式採用不同的方法。例如,可以設定避免週末的日期的調節器,或者將日期設定為一個月的最後一天。
  • Temporal
    它繼承了TemporalAccessor,再次基礎上擴充套件了一些介面。
  • Serializable
    類的可序列化性是由實現java.io.Serializable介面啟用的。不實現此介面的類將不會有任何狀態序列化或反序列化。可序列化類的所有子型別本身都是可序列化的。序列化介面沒有方法或欄位,只用於標識可序列化的語義。
  • Instant
    時間線上的瞬時點。這個類對時間線上的一個瞬時點進行建模。這可能用於記錄應用程式中的事件時間戳。

首先Instant.java的API JDK8 Instant API,可以通過API知道一些基礎的知識。所謂的 Instant 類代表的是某個時間(有點像 java.util.Date),它是精確到納秒的(而不是象舊版本的Date精確到毫秒)。如果使用納秒去表示一個時間則原來使用一位Long型別是不夠的,需要佔用更多一點的儲存空間,實際上其內部是由兩個Long欄位組成,第一個部分儲存的是自標準Java計算時代(就是1970年1月1日開始)到現在的秒數,第二部分儲存的是納秒數(永遠不會超過999,999,999)。靜態方法:Instant靜態方法


測試案例:

package vip.wulang.springdatajpa;

import org.junit.Test;

import java.time.Instant;

/**
 * @author CoolerWu on 2018/11/12.
 * @version 1.0
 */
public class InstantTest {
    @Test
    public void justTest() {
        // 從系統時鐘獲得當前時間
        // 這將查詢系統UTC時鐘以獲得當前即時訊息
        // 使用這種方法將阻止使用備用時間源進行測試,因為時鐘實際上是硬編碼的
        // 返回當前時間物件
        Instant instant = Instant.now();

        long currentLong = 0L;

        // 獲取時間戳(單位:秒)
        System.out.println((currentLong = instant.getEpochSecond()));

        // 獲得當前時間的年月日格式,toString()可以省略
        System.out.println(instant.toString());

        // 根據時間戳構建一個Instant物件
        // 從1970-01-01T00:00:00Z的epoch中獲取一個瞬間使用秒的例項
        // nanos被設為零
        System.out.println(Instant.ofEpochSecond(currentLong).toString());
        
        // 由於時間戳單位秒,所以轉換成毫秒需要乘以1000
        System.out.println(Instant.ofEpochMilli(currentLong * 1000).toString());

        // 根據時間戳構建一個Instant物件
        // 從1970-01-01T00:00:00Z的epoch中獲取一個瞬間使用秒的例項
        System.out.println(Instant.ofEpochSecond(currentLong, instant.getNano()).toString());

        // 字串必須在UTC中表示有效的瞬間
        // 從文字字串中獲取Instant例項,例如,字串必須在UTC中表示有效的瞬間,並使用datetimeformat.iso_instant解析
        // getEpochSecond() 獲取秒數
        // getNano() 獲取納秒數
        System.out.println(Instant.parse("2007-12-03T10:15:30.44Z").getEpochSecond());
        System.out.println(Instant.parse("2007-12-03T10:15:30.44Z").getNano());
    }
}

結果

結果

總結

  官方給出的解釋:simple beautiful strong immutable thread-safe。執行緒安全並且不可變,類似於String和8個包裝類。相比於Date類來說,他可能更加方便,也不需要去捕獲什麼異常,但是也要注意字串轉換的時間一定要符合2007-12-03T10:15:30.44Z這種格式才可以,不然會丟擲異常。