伊奥拉纳!来自复活节岛的问候!
我在 Android 中使用 JodaTime 2.10.6 打印 EAST、PDT、GMT、EEST 等日期的时区缩写:
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 名称(好):
我一直认为 JodaTime 拥有所有时区信息并且独立于平台数据。我不知道他们依赖底层平台来提供这些时区名称?
有没有NameProvider
可用的,我可以插入 JodaTime,也许是一些专门基于捆绑的 TZData 的实现?
或者我可以让它在Android上正确打印这些时区缩写的任何其他方式?
毛鲁-你!