天天看點

Java 8 新日期時間 API ( 中 ) - 時區日期時間

上一章節 Java 8 新日期時間 API ( 上 ) - 本地日期時間 我們對 Java 8 重新設計的日期時間 API 做了一些基礎的介紹,同時詳細介紹了和本地時間有關的幾個類

LocalDateTime

LocalDate

LocalTime

這三個類有選擇的隐藏了時區的處理。它們内部會使用作業系統目前的時區。是以在我們使用中會将其當作不包含時區處理。

與此同時,Java 在

java.time

包中也提供了幾個類用于處理需要關注時區的日期時間 API:

java.time.ZonedDateTime

java.time.ZoneId

。前者用于處理需要時區的日期時間,後者用于處理時區。

ZonedDateTime

LocalDateTime

類似,幾乎有着相同的 API。從某些方面說,

ZonedLocalTime

如果不傳遞時區資訊,那麼它會預設使用作業系統的時區,這樣,結果其實和

LocalDateTime

是類似的。

比如,我們可以使用

ZonedDateTime

now()

方法傳回目前時區 ( 作業系統時區 ) 的日期時間,調用

parse()

方法可以将一個包含了時區資訊的字元串格式的日期時間轉化為一個

ZonedDateTime

執行個體。

import java.time.ZonedDateTime;

public class Java8DateTimeTester {

  public static void main(String[] args) {
    ZonedDateTime now = ZonedDateTime.now();
    System.out.println("目前日期時間是:" + now);

    ZonedDateTime datetime = ZonedDateTime.parse("2020-03-25T09:23:00+08:00");
    System.out.println("日期時間是:" + datetime);
  }
}
           

運作結果如下

目前日期時間是:2020-05-10T23:13:43.406+08:00[Asia/Shanghai]
日期時間是:2020-03-25T09:23+08:00
           

我們還可以調用

ZonedDateTime

對象的

toLocalDate()

toLocalTime()

方法将擷取該執行個體的轉換為本地的日期和時間

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZonedDateTime;

public class Java8DateTimeTester {

  public static void main(String[] args) {
    ZonedDateTime now = ZonedDateTime.now();
    System.out.println("目前日期時間是:" + now);

    LocalDate localDate = now.toLocalDate();
    System.out.println("本地日期是:" + localDate);

    LocalTime localTime = now.toLocalTime();
    System.out.println("本地時間是:" + localTime);
  }
}
           

運作結果如下

目前日期時間是:2020-05-10T23:16:33.905+08:00[Asia/Shanghai]
本地日期是:2020-05-10
本地時間是:23:16:33.905
           

處理時區

時區相關的資訊,我們可以使用

ZoneId

類來處理。

比如可以調用

ZoneId

類的靜态方法

systemDefault()

傳回目前的時區。

import java.time.ZoneId;

public class Java8DateTimeTester {

  public static void main(String[] args) {
    ZoneId currentZone = ZoneId.systemDefault();
    System.out.println("目前時區是: " + currentZone);

    ZoneId zoneId = ZoneId.of("UTC+3");
    System.out.println("獲得東3區的時區: " + zoneId);
  }
}
           

運作結果如下

目前時區是: Asia/Shanghai
獲得東3區的時區: UTC+03:00
           

我們還可以調用

ZonedDateTime

執行個體的

getZone()

方法擷取執行個體所在的時區

import java.time.ZonedDateTime;

public class Java8DateTimeTester {

  public static void main(String[] args) {
    ZonedDateTime now = ZonedDateTime.now();
    System.out.println("目前時區是: " + now.getZone());
  }
}
           

運作結果如下

目前時區是: Asia/Shanghai