gpt4 book ai didi

java - 如何使用Java中的新API替换sun.util.calendar.ZoneInfo

转载 作者:行者123 更新时间:2023-12-02 10:08:47 28 4
gpt4 key购买 nike

我在我的一个测试用例中找到了这个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; dr

请改用现代的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(均已淘汰)

根据 this class JavaDoc,这只是支持Sun提供的JVM TimeZone类的具体实现。


  ZoneInfo是TimeZone的实现子类,它表示GMT偏移量和时区的夏时制转换。


TimeZoneZoneInfo都已过时。您应该改为使用现代的java.time类。

在构建 Java Platform Module System时,Oracle开始逐步淘汰对其Java实现中已过时或从未打算供公众使用的部分的访问。这是一个持续的过程。调用来自各种 com.sun.*包的类的任何代码都应重写为使用其他类。

java.time

TimeZone是与最早的Java版本捆绑在一起的可怕的日期时间类之一。这些现在已成为遗留问题,几年前被JSR 310中定义的现代行业领先的java.time类所取代。

ZoneId =时区

现在用 ZoneId类表示时区,代替 TimeZoneoffset-from-UTC类可跟踪区域中每个区域使用的 ZoneRules的过去,现在和将来的更改历史。

数据

请注意,世界各地的政客经常更改时区。这种情况发生的频率超出您的想象。这些更改由 tzdata data file跟踪。每当您关心的区域发生更改时,都应该在Java安装,操作系统,数据库(例如Postgres)和其他管理自己的时区列表的库中更新此时区定义列表。

区域规则

Continent/Region的格式指定 proper time zone name,例如 America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如 ESTIST,因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。

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


获取该区域的规则。

ZoneRules rules = z.getRules() ;


Instant的区域规则

Instant表示 UTC中的时刻,即 offset-from-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")


…所以我能为您做的事不多了。

您的代码似乎正在寻找与其 offset-from-UTC(小时-分钟-秒)相匹配的时区以及是否与 Daylight Saving Time (DST)相匹配。如上所述,您可以查询此信息的 ZoneRules



关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧 legacy日期时间类,例如 java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见 Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为 JSR 310

现在位于 Joda-Time中的 maintenance mode项目建议迁移到 java.time类。

您可以直接与数据库交换java.time对象。使用与 JDBC driver或更高版本兼容的 JDBC 4.2。不需要字符串,不需要 java.sql.*类。

在哪里获取java.time类?


Java SE 8Java SE 9Java SE 10Java SE 11和更高版本-具有捆绑实现的标准Java API的一部分。


Java 9添加了一些次要功能和修复。

Java SE 6Java SE 7


大多数java.time功能都被反向移植到 ThreeTen-Backport中的Java 6和7。

Android


更高版本的Android捆绑了java.time类的实现。
对于较早的Android(<26), ThreeTenABP项目改编为 ThreeTen-Backport(如上所述)。请参见 How to use ThreeTenABP…



ThreeTen-Extra项目使用其他类扩展了java.time。该项目是将来可能向java.time添加内容的试验场。您可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuartermore

关于java - 如何使用Java中的新API替换sun.util.calendar.ZoneInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55149139/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com