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()
方法,它返回所有當前已知時區的集合。要獲取所有區域的列表,您需要編寫以下代碼:
代碼 | 控制台輸出(部分) |
---|---|
|
|
ZoneId
要通過名稱獲取對象,您需要使用靜態of()
方法;
代碼 | 筆記 |
---|---|
|
|
2.創建ZonedDateTime
對象
創建ZonedDateTime
對象時,需要調用類的靜態now()
方法,傳遞一個ZoneId
對像給它。
代碼 | 控制台輸出 |
---|---|
|
|
如果您不將對像傳遞ZoneId
給該now()
方法(這是允許的),則時區將根據運行該程序的計算機的設置自動確定。
例子:
代碼 | 控制台輸出 |
---|---|
|
|
將全球日期轉換為本地日期
其中一個有趣的特性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
有很多方法來獲取日期和時間的各個元素。以下是這些方法的列表:
|
返回特定日期的年份 |
|
返回日期的月份:幾個常量之一 -JANUARY, FEBRUARY, ...; |
|
返回日期所在月份的索引。一月 == 1 |
|
返回一個月中的第幾天的索引 |
|
返回星期幾:幾個常量之一 -MONDAY, TUESDAY, ...; |
|
返回一年中第幾天的索引 |
|
返回小時數 |
|
返回分鐘 |
|
返回秒數 |
|
返回納秒 |
所有的方法都完全類似於類的方法LocalDateTime
。當然,該類ZonedDateTime
具有可讓您處理日期和時間的方法。也就是說,調用方法的對像不會改變。相反,他們返回一個新ZonedDateTime
對象:
方法 | 描述 |
---|---|
|
將年份添加到日期 |
|
將月份添加到日期 |
|
在日期中添加天數 |
|
增加小時數 |
|
增加分鐘數 |
|
加秒 |
|
添加納秒 |
|
從日期中減去年份 |
|
從日期中減去月份 |
|
從日期中減去天數 |
|
減去小時數 |
|
減去分鐘 |
|
減秒 |
|
減去納秒 |
我們不會提供任何示例,因為我們認為通過類比我們剛才考慮的類,這裡的一切都很清楚。
GO TO FULL VERSION