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這種格式纔可以,不然會拋出異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章