簡體   English   中英

如何使用Java中的新API替換sun.util.caldender.ZoneInfo

[英]How to replace sun.util.caldender.ZoneInfo with new API in java

我在我的一個測試用例中發現了這個Api Sun.util.calendar.zoneInfo,當我對其進行編譯時,我收到警告消息,指出sun.util.calender.ZoneInfo是內部專有API,將來可能會刪除。

@Test @Ignore("This test case was previously ignore, appears incomplete")
    public void test_getTimeZoneFromTimeZoneDifferential() throws Exception {
        TimeZone customCali = DMessageFactory.getTimeZoneFromTimeZoneDifferential("110");
        System.out.println("\ncustomCali: "+customCali+"\n");
        String[] ids = TimeZone.getAvailableIDs();
        for(int i = 0; i < ids.length; i++) {
            TimeZone tz = TimeZone.getTimeZone(ids[i]);

            if(tz instanceof sun.util.calendar.ZoneInfo) {
                TimeZone realZone = ((sun.util.calendar.ZoneInfo) tz).getLastRuleInstance();
                if(realZone == null) {
                    if(tz.useDaylightTime() == customCali.useDaylightTime() &&
                       tz.getOffset(0) == customCali.getOffset(0)) {
                        System.out.println("match2: "+tz+"   "+tz.getDisplayName(true, TimeZone.SHORT));
                    }
                    //System.out.println("no real zone: "+tz);
                    continue;
                }

                if(customCali.hasSameRules(realZone)) {
                    System.out.println("match: "+realZone.getDisplayName(true, TimeZone.SHORT));
                }
                else if(realZone.getOffset(0) == customCali.getOffset(0)) {
                    //System.out.println("semi-match: "+tz);
                }
                else {
                    //System.out.println("NO-match: "+tz);
                }
            } else {
                //System.out.println("no-match: "+tz);
            }
        }

我確實需要替換此sun.util.calendar.ZoneInfo並添加另一個API而不破壞其功能,請為此提供幫助。

TL;博士

請改用現代的java.time類。

循環所有已知區域,詢問該區域的規則集,指定時間,然后詢問所需的信息。

Instant instant = Instant.now() ;
for( ZoneId z : ZoneId.getAvailableZoneIds() )
{
    String zoneName = z.getDisplayName( TextStyle.SHORT , Locale.US ) ;

    ZoneRules rules = z.getRules() ;

    ZoneOffset offset = rules.getOffset​( instant ) ;
    int secondsOfOffset = offset.getTotalSeconds() ;

    boolean currentlyInDST = rules.isDaylightSavings( instant ) ;
    Duration amountOfCurrentDstAdjustment = rules.getDaylightSavings( instant ) ;

    …
}

sun.util.calender.ZoneInfo是支持TimeZone實現(均已過時)

根據此類JavaDoc ,這只是支持Sun提供的JVM的TimeZone類的具體實現。

ZoneInfo是TimeZone的實現子類,它表示GMT偏移量和時區的夏時制轉換。

TimeZoneZoneInfo均已過時。 您應該改為使用現代的java.time類。

在構建Java平台模塊系統時 ,Oracle開始逐步淘汰對其Java實現中已過時或從未打算供公眾使用的部分的訪問。 這是一個持續的過程。 您調用任何來自com.sun.*軟件包的類的代碼都應重寫為使用其他類。

java.time

TimeZone是與最早的Java版本捆綁在一起的可怕的日期時間類之一。 這些現在已成為遺留物,幾年前被JSR 310中定義的現代業界領先的java.time類所取代。

ZoneId =時區

現在用ZoneId類表示時區,代替TimeZone ZoneRules類可跟蹤區域中每個區域使用的UTC偏移量的過去,現在和將來的更改歷史。

的tzdata

請注意,世界各地的政客經常更改時區。 這種情況發生的頻率超出您的想象。 這些更改由tzdata數據文件跟蹤。 每當您關心的區域發生更改時,都應該在Java安裝,操作系統,數據庫(例如Postgres)和其他管理自己的時區列表的庫中更新此時區定義列表。

區域規則

Continent/Region的格式指定正確的時區名稱 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用2-4字母的縮寫,例如ESTIST因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  

獲取該區域的規則。

ZoneRules rules = z.getRules() ;

Instant區域規則

Instant表示UTC中的時刻,即與UTC偏移量為零小時-分鍾-秒的時刻。 通過指定時間,您可以詢問當時有效的規則。

Instant instant = Instant.now() ;
boolean currentlyInDST = rules.isDaylightSavings( instant ) ;
Duration amountOfCurrentDstAdjustment = rules.getDaylightSavings( instant ) ;

循環區

您可以通過調用ZoneId.getAvailableZoneIds方法來獲取嵌入式tzdata已知的所有時區,從而重新實現代碼。 您可以循環返回Set

Set< String > zones = ZoneId.getAvailableZoneIds() ;
for( String z : zones )
{
    ZoneRules rules = ZoneId.of( z ).getRules() ;
    …
}

您無需解釋代碼,例如:

DMessageFactory.getTimeZoneFromTimeZoneDifferential("110")

…因此我能為您做的事不多。

您的代碼似乎正在尋找與其UTC偏移量 (小時-分鍾-秒)相匹配的時區,以及是否與夏時制(DST)相匹配。 如上所述,您可以詢問ZoneRules以獲得此信息。


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

現在處於維護模式Joda-Time項目建議遷移到java.time類。

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

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

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