3

伊奥拉纳!来自复活节岛的问候!

我在 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 名称(坏):

Android TZ 名称

  • JDK TZ 名称(好):

本地 TZ 名称

我一直认为 JodaTime 拥有所有时区信息并且独立于平台数据。我不知道他们依赖底层平台来提供这些时区名称?

有没有NameProvider可用的,我可以插入 JodaTime,也许是一些专门基于捆绑的 TZData 的实现?

或者我可以让它在Android上正确打印这些时区缩写的任何其他方式?

毛鲁-你!

4

0 回答 0