1.ZonedDateTime

Date Time API 中還有一個非常有趣的類:類ZonedDateTime。它的主要目的是方便處理不同時區的日期。

LocalDate非常適合表示日期。例如,生日。無論我在哪裡,我的生日都是 3 月 15 日。這是一個日期的例子。

LocalTime非常適合描述時間,就像鬧鐘上設置的時間:我將鬧鐘設置為早上 5:00,而我在哪裡並不重要。凌晨 5:00 是凌晨 5:00。這是一個處理時間的例子。

現在假設我們正在編寫一個預訂航班的應用程序。飛機起飛和到達以當地時間為準。飛機在空中飛行的時間是固定的,但時區可以改變。

時區

順便說一句,時區真是一團糟。如果您認為有 24 個時區,那您就大錯特錯了。

例如,印度的時間與格林威治標準時間相差五個半小時:GMT+5:30。一些國家/地區切換到夏令時,而其他國家/地區則沒有。更重要的是,不同的國家在一年中的不同時間切換到夏令時。

一些國家通過法律取消夏令時,或重新引入,或再次取消。

無論如何,世界是有時區的,每個時區內都有一個時間。不同時區的時間在一年中的某些時期可能重合,而在其他時期則不同。時區通常以位於其中的主要城市命名:Europe/Monaco, Asia/Singapore,但也有例外 — US/Pacific

據官方統計,目前有 599 個時區。想一想:599。這與 24 相去甚遠。歡迎來到全球化的世界。

ZoneId包中的類用於java.time在 Java 中存儲時區。

順便說一句,它有一個靜態getAvailableZoneIds()方法,它返回所有當前已知時區的集合。要獲取所有區域的列表,您需要編寫以下代碼:

代碼 控制台輸出(部分)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

ZoneId要通過名稱獲取對象,您需要使用靜態of()方法;

代碼 筆記
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2.創建ZonedDateTime對象

創建ZonedDateTime對象時,需要調用類的靜態now()方法,傳遞一個ZoneId對像給它。

代碼 控制台輸出
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

如果您不將對像傳遞ZoneId給該now()方法(這是允許的),則時區將根據運行該程序的計算機的設置自動確定。

例子:

代碼 控制台輸出
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

將全球日期轉換為本地日期

其中一個有趣的特性ZonedDateTime是它能夠轉換為本地日期和時間。例子:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. 與時間打交道

LocalDateTime類一樣,該類ZonedDateTime有很多方法來獲取日期和時間的各個元素。以下是這些方法的列表:

int getYear()
返回特定日期的年份
Month getMonth()
返回日期的月份:幾個常量之一 -JANUARY, FEBRUARY, ...;
int getMonthValue()
返回日期所在月份的索引。一月 == 1
int getDayOfMonth()
返回一個月中的第幾天的索引
DayOfWeek getDayOfWeek()
返回星期幾:幾個常量之一 -MONDAY, TUESDAY, ...;
int getDayOfYear()
返回一年中第幾天的索引
int getHour()
返回小時數
int getMinute()
返回分鐘
int getSecond()
返回秒數
int getNano()
返回納秒

所有的方法都完全類似於類的方法LocalDateTime。當然,該類ZonedDateTime具有可讓您處理日期和時間的方法。也就是說,調用方法的對像不會改變。相反,他們返回一個新ZonedDateTime對象:

方法 描述
plusYears(int)
將年份添加到日期
plusMonths(int)
將月份添加到日期
plusDays(int)
在日期中添加天數
plusHours(int)
增加小時數
plusMinutes(int)
增加分鐘數
plusSeconds(int)
加秒
plusNanos(int)
添加納秒
minusYears(int)
從日期中減去年份
minusMonths(int)
從日期中減去月份
minusDays(int)
從日期中減去天數
minusHours(int)
減去小時數
minusMinutes(int)
減去分鐘
minusSeconds(int)
減秒
minusNanos(int)
減去納秒

我們不會提供任何示例,因為我們認為通過類比我們剛才考慮的類,這裡的一切都很清楚。