Java8 Instant時間戳使用小記

Java 8 Instant 時間戳

用於“時間戳”的運算。它是以Unix元年(傳統 的設定為UTC時區1970年1月1日午夜時分)開始 所經歷的描述進行運算

1. 創建Instant實例,獲取系統的當前時間now

 /**
  * Java 8 Instant時間戳學習
  */
 @Test
 public void testInstant(){
  // 通過Instant創建Instant實例 返回:return Clock.systemUTC().instant();
  Instant now = Instant.now();

  //控制臺輸出:now = 2020-12-29T06:32:49.480Z (以ISO-8601格式輸出)
  System.out.println("now = " + now);
 }

註意:這裡額控制臺輸出:now = 2020-12-29T06:32:49.480Z。

Intance的now方法:

 public static Instant now() {
  return Clock.systemUTC().instant();
 }

這是輸出的世界標準時間,其中T表示時分秒的開始(或者日期與時間的間隔),Z表示這是一個世界標準時間。

Instant 是時間戳,是指世界標準時格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數,Instant本身實際上是指明時區瞭,是0時區(也就是比北京時間少8小時)。

2. 獲取當前時區的時間(本地時間)

2.1 通過方法Instant.now().atZone(ZoneId.systemDefault())獲取當前地區的時間

  ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.systemDefault());
  System.out.println(zonedDateTime);

輸出結果

2020-12-31T17:31:14.953+08:00[Asia/Shanghai]

2.2 通過增加8小時,轉化為北京時間

方法名稱 描述
plusMillis() 增加時間戳時間,以毫秒為單位
minusNanos() 增加時間戳時間,以納秒為單位
minusSeconds() 增加時間戳時間,以秒為單位
TimeUnit.HOURS.toMillis() 將小時轉化為毫秒數
  //增加8個小時,使Instant.now()返回時間為北京時間
  Instant now2 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));
  System.out.println("now2 = " + now2);

輸出結果:now2 = 2020-12-29T14:35:32.631Z

轉換為符合當前的北京時間。

3. 通過Instant獲取當前時間距離格林威治時間的值

通過 getEpochSecond()方法獲取距離格林威治時間的秒數

通過toEpochMilli()方法獲取距離格林威治時間的毫秒數

  //增加8個小時,使Instant.now()返回時間為北京時間
  Instant now2 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));
  //獲取格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)距離當前時間的秒/毫秒值
  System.out.println("距離1970年01月01日00時00分00秒 : "+now2.getEpochSecond() + "秒");
  System.out.println("距離1970年01月01日00時00分00秒 : "+now2.toEpochMilli() + "毫秒");

輸出結果:

距離1970年01月01日00時00分00秒 : 1609435201秒
距離1970年01月01日00時00分00秒 : 1609435201645毫秒

4. Instant的from、parse方法

4.1 java.time.Instant.from(TemporalAccessor temporal)源碼:

 public static Instant from(TemporalAccessor temporal) {
  if (temporal instanceof Instant) {
   return (Instant) temporal;
  }
  Objects.requireNonNull(temporal, "temporal");
  try {
   long instantSecs = temporal.getLong(INSTANT_SECONDS);
   int nanoOfSecond = temporal.get(NANO_OF_SECOND);
   return Instant.ofEpochSecond(instantSecs, nanoOfSecond);
  } catch (DateTimeException ex) {
   throw new DateTimeException("Unable to obtain Instant from TemporalAccessor: " +
     temporal + " of type " + temporal.getClass().getName(), ex);
  }
 }

參數:temporal 是要轉換的時間對象,返回的是一個轉換為Instant的瞬間值

如果轉換為Instant的時候失敗,會拋出異常“DateTimeException`

4.2 parse方法源碼

 public static Instant parse(final CharSequence text) {
  return DateTimeFormatter.ISO_INSTANT.parse(text, Instant::from);
 }

創建自定義的時間戳

  //創建自定義的時間戳
  System.out.println(Instant.parse("2020-12-29T14:35:32.631Z"));	

輸出結果

2020-12-29T14:35:32.631Z

5. Instant的其它常用函數

//獲取當前時間戳
  Instant instant = Instant.now();
  //獲得當前時間戳並且增加66毫秒
  Instant instant1 = Instant.now().plusMillis(66);
  //獲得當前時間戳並且減少66毫秒
  Instant instant2 = Instant.now().minusMillis(66);

  //判斷時間戳 instant 是否在 instant1 之後,返回boolean
  System.out.println(instant.isAfter(instant1)); //返回false
  //判斷時間戳 instant 是否在 instant1 之前,返回boolean
  System.out.println(instant.isBefore(instant1)); //返回true
  //判斷兩個時間戳是否相等, 返回boolean值
  System.out.println(instant.equals(instant1)); //返回false



  //獲得當前時間戳並增加1小時 通過TimeUnit.HOURS.toMillis(1)將小時轉換為毫秒,然後通過plusMillis增加
  Instant instant3 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(1));
  //獲取時間戳 instant和instant3 相差天數,返回long類型
  //如果小於1天,都算零天,大於等於1天,小於2天算一天
  System.out.println("相差天數 = " + instant.until(instant3, ChronoUnit.DAYS)); //返回0
  //獲取時間戳 instant和instant3 相差的小時數,返回long類型
  System.out.println("相差小時 = " + instant.until(instant3, ChronoUnit.HOURS)); //返回1
  //獲取時間戳 instant和instant3 相差的毫秒數,返回long類型
  System.out.println("相差毫秒數 = " + instant.until(instant3, ChronoUnit.MILLIS)); //返回3600000

輸出結果:

false
true
false
相差天數 = 0
相差小時 = 1
相差毫秒數 = 3600000

6. 將獲取的時間戳轉化為LocalDate

 Instant now = Instant.now();
 //UTC
 ZonedDateTime atZone = now.atZone(ZoneOffset.UTC);
 	//LocalDateTime
 atZone.toLocalDateTime();
 LocalDateTime.from(atZone);

 //LocalDate
 atZone.toLocalDate();
 LocalDate date = LocalDate.from(atZone);
 //LocalDateTime
 atZone.toLocalDateTime();
 LocalDateTime.from(date);

總結

到此這篇關於Java8 Instant時間戳使用小記的文章就介紹到這瞭,更多相關Java8 Instant時間戳內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: