簡體   English   中英

Java 中的時區縮寫

[英]Timezone Abbreviations in Java

我有一個 Java Date對象的集合,從一個沒有存儲時區信息的舊數據庫加載。

我知道所有日期(包括小時、分鍾和秒)都是針對美國東部時區的。

我想為每個日期導出正確的時區縮寫(“EST”或“EDT”)。

這是我的嘗試(使用 Java 11)。 至少可以說,這是笨拙的。

我研究了以下課程:

java.util.TimeZone
java.time.ZoneId
java.time.zone.ZoneRules

這是我的方法 - 它使用兩個語句純粹是為了讓我有機會在一周后仍然理解我所寫的內容。

編輯 - 根據下面@VGR 的評論,我更新了示例。 現在它需要一個時區顯示名稱 - 例如"America/New_York"

public String getTimezoneAbbrev(Date date, String tzName) {
    TimeZone tz = TimeZone.getTimeZone(tzName);
    boolean isDaylightSavings = tz.toZoneId().getRules().isDaylightSavings(date.toInstant());
    return tz.getDisplayName(isDaylightSavings, TimeZone.SHORT);
}

它有效(我有測試用例),但是有沒有一種不那么冗長的方法?

(我沒有找到任何使用Date作為起點的代碼示例)。

像下面這樣的?

import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        System.out.println(TimeZone.getDefault().getDisplayName(TimeZone.getDefault().inDaylightTime(new Date()),TimeZone.SHORT));
    }
}

我已經接受了 Arvind 的回答,因為他指出了TimeZone.inDaylightTime() - 但為了記錄,這里是我問題中方法的更新版本。

現在更簡潔:

// tzName is a timezone display name, such as "America/New_York"

public static String getTimezoneAbbrev(Date date, String tzName) {
    TimeZone tz = TimeZone.getTimeZone(tzName);
    return tz.getDisplayName(tz.inDaylightTime(date), TimeZone.SHORT);        
}

警告

我還發現這個問題中的答案很有幫助 - 因為如果您在使用 TimeZone.getTimeZone() 時鍵入不存在的時區顯示名稱(或 ID),Java 將返回“指定的時區或 GMT 時區,如果給定的 ID 不能是理解”(強調我的)。 見這里

正在輸入...

America/New-York

...代替...

America/New_York

......足以引起問題。

所以...

我們應該使用java.time.ZoneId代替。 這將引發無效/未知 ID 的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM