JDK8之時間線物件Instant
阿新 • • 發佈:2018-11-22
JDK8中Instant
前言
如果是 JDK8 的應用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat,官方給出的解釋:simple beautiful strong immutable thread-safe。
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)。靜態方法:
測試案例:
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這種格式才可以,不然會丟擲異常。