![](/img/trans.png)
[英]How to fix sonar issue for Replace this usage of Sun classes by ones from the Java API?
[英]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而不破壞其功能,請為此提供幫助。
請改用現代的java.time類。
java.time.ZoneId
替換TimeZone
java.time.zone.ZoneRules
替代sun.util.calender.ZoneInfo
循環所有已知區域,詢問該區域的規則集,指定時間,然后詢問所需的信息。
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偏移量和時區的夏時制轉換。
TimeZone
和ZoneInfo
均已過時。 您應該改為使用現代的java.time類。
在構建Java平台模塊系統時 ,Oracle開始逐步淘汰對其Java實現中已過時或從未打算供公眾使用的部分的訪問。 這是一個持續的過程。 您調用任何來自com.sun.*
軟件包的類的代碼都應重寫為使用其他類。
TimeZone
是與最早的Java版本捆綁在一起的可怕的日期時間類之一。 這些現在已成為遺留物,幾年前被JSR 310中定義的現代業界領先的java.time類所取代。
ZoneId
=時區 現在用ZoneId
類表示時區,代替TimeZone
。 ZoneRules
類可跟蹤區域中每個區域使用的UTC偏移量的過去,現在和將來的更改歷史。
請注意,世界各地的政客經常更改時區。 這種情況發生的頻率超出您的想象。 這些更改由tzdata數據文件跟蹤。 每當您關心的區域發生更改時,都應該在Java安裝,操作系統,數據庫(例如Postgres)和其他管理自己的時區列表的庫中更新此時區定義列表。
以Continent/Region
的格式指定正確的時區名稱 ,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用2-4字母的縮寫,例如EST
或IST
因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。
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 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
要了解更多信息,請參見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中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.