Java Android中缺少JodaTime时区缩写
伊奥拉娜!复活节岛的问候 我正在Android中使用JodaTime 2.10.6打印日期的时区缩写,如EAST、PDT、GMT、EEST:Java Android中缺少JodaTime时区缩写,java,android,timezone,jodatime,tzdata,Java,Android,Timezone,Jodatime,Tzdata,伊奥拉娜!复活节岛的问候 我正在Android中使用JodaTime 2.10.6打印日期的时区缩写,如EAST、PDT、GMT、EEST: DateTimeZone zoneEasterIsland = DateTimeZone.forID("Pacific/Easter"); DateTime nowEasterIsland = DateTime.now(zoneEasterIsland); long millis = nowEasterIsland.getMillis(
DateTimeZone zoneEasterIsland = DateTimeZone.forID("Pacific/Easter");
DateTime nowEasterIsland = DateTime.now(zoneEasterIsland);
long millis = nowEasterIsland.getMillis();
String key = zoneEasterIsland.getNameKey(millis);
String shortName = zoneEasterIsland.getShortName(millis);
String name = zoneEasterIsland.getName(millis);
String shortNameLocalized = zoneEasterIsland.getShortName(millis, Locale.US);
String nameLocalized = zoneEasterIsland.getName(millis, Locale.US);
System.out.println("JodaTime Key: " + key );
System.out.println("JodaTime Short Name: " + shortName );
System.out.println("JodaTime Name: " + name );
System.out.println("JodaTime Short Name Localized: " + shortNameLocalized );
System.out.println("JodaTime Name Localized: " + nameLocalized );
在任何Android设备上,都会打印:
JodaTime Key: -06
JodaTime Short Name: GMT-06:00
JodaTime Name: Easter Island Standard Time
JodaTime Short Name Localized: GMT-06:00
JodaTime Name Localized: Easter Island Standard Time
…但我想制作的是EAST
或EASST
,我一个都拿不到
如果我在本地单元测试上运行相同的代码(在计算机上执行,而不是在Android上执行),我会得到期望的结果:
JodaTime Key: -06
JodaTime Short Name: EAST
JodaTime Name: Easter Is. Time
JodaTime Short Name Localized: EAST
JodaTime Name Localized: Easter Is. Time
我调试了原因,JodaTime使用了一个DefaultNameProvider
,它显然从平台本身获取所有时区名称组:DateFormatSymbols。getZoneStrings()
在JDK和Android中的实现方式不同
Android似乎进入了libcore.icu
,它是本机实现的,并且在提供的600个时区中,似乎缺少了大部分的缩写。然而,JDK几乎拥有所有这些功能!没有一个实现是可调试的
- Android TZ名称(错误):
- JDK TZ名称(良好):
NameProvider
可用,我可以将其插入到JodaTime中,或者是一些完全基于捆绑数据的实现
或者我可以用其他方法让它在Android上正确打印这些时区缩写
毛鲁尔 如果其他方法都失败了,您可以迁移到java.time,这是现代java日期和时间API,在某种意义上是Joda time的继承者。如果API级别低于26,那么通过后端口,。我已经尝试了Java8和310ABP。这是同样的问题,Android上没有缩写,但在普通JDK上有。