時區

Module 1 no mu
等級 27 , 課堂 5
開放

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)
減去納秒

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


留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION