我在我的一个测试用例中找到了这个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,请帮助我解决这个问题。
发布于 2019-03-13 19:28:26
tl;dr
使用现代的java.time类代替。
java.time.ZoneId取代TimeZonejava.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类。
在构建https://en.wikipedia.org/wiki/Java_Platform_Module_System时,甲骨文开始逐步取消对它们的部分实现的访问,这些部分已经过时,或者从未打算用于公共消费。这是一个持续不断的过程。从各种com.sun.*包调用类的任何代码都应该重写,以使用其他类。
java.time
TimeZone是与最早版本的Java捆绑在一起的糟糕的日期时间类之一。这些现在是遗留下来的,几年前被定义在JSR 310中的现代行业领先的java.time类所取代。
ZoneId =时区
时区现在用ZoneId类表示,取代了TimeZone。过去、现在和将来对区域中每个区域使用的与世界协调时相抵的更改的历史由ZoneRules类跟踪。
泽达
请注意,时区经常被世界各地的政治家改变。这种情况比你想象的更频繁。这些更改由数据文件跟踪。每当您关心的区域发生更改时,都应该更新Java安装、操作系统、数据库(如Postgres )和其他管理自己时区列表的库中的时区定义列表。
区域规则
以Continent/Region格式指定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中的某个时刻,即与世界协调时相抵为0小时-分-秒的时刻。通过指定某个时刻,您可以对当时有效的规则提出问题。
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")…所以我不能为你做更多的事。
您的代码似乎在寻找一个与其与世界协调时相抵 (小时-分钟-秒)相匹配的时区,无论是否在夏令时(DST)中。如前所述,您可以查询ZoneRules以获取此信息。
关于java.time
http://docs.oracle.com/javase/10/docs/api/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 4.2。不需要字符串,也不需要java.sql.*类。
在哪里获得java.time类?
三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和更多。
https://stackoverflow.com/questions/55149139
复制相似问题