关于非公历日历选择器对话框的图形用户界面,您确实必须从头开始自己实现它。以下注释是关于其他日历的一般可用性的。
API 级别 24 之前的 Android 旧状态
好吧,在这里我们(再次)看到 Oracle 和 Android 之间的区别。如果你看一下旧版 Android 代码的来源 https://android.googlesource.com/platform/libcore.git/+/android-3.2.4_r1/luni/src/main/java/java/util/Calendar.java那么你只会看到公历被实例化:
991 public static synchronized Calendar getInstance() {
992 return new GregorianCalendar();
993 }
这与什么形成对比Oracle-Java https://docs.oracle.com/javase/7/docs/technotes/guides/intl/calendar.doc.html是否根据以下描述了两个替代日历java.util.Calendar
(可以通过区域设置或 unicode-ca-extension 选择):泰国佛教徒(仅在 1940 年之后正确)和日本帝国(自明治时代以来)。
Android-N(API 级别 24)
然而,从 API 级别 24 (Android-N) 开始,Google 引入了从 ICU4J 项目取代的新日历。这些日历可以在包装中找到android.icu.util https://developer.android.com/reference/android/icu/util/package-summary.html:
- 佛教(1940年后才正确)
- 中文(有准确性问题)
- Coptic
- Ethiopic
- Hebrew
- 印度语(萨卡语)
- 伊斯兰教(4 种变体)
- 日语(仅用于现代)
- 台湾(民国)
Android 的当前状态(API 级别 26 或更高)
The new java.time
-引入了API,因此合并了以下四种非公历:
- 伊斯兰-乌马尔库拉(沙特阿拉伯)
- 日语(仅限明治时代,1872 年以后)
- 民国(台湾)
- 泰国佛教(1940年后才正确)
备择方案?
实际上,主要有三个第三方库承诺为旧版 Android 版本提供替代日历。
=> Threeten-ABP https://github.com/JakeWharton/ThreeTenABP
这是 Java-8 中内置的新时间库的向后移植的一个薄包装,它引入了 4 个部分新的日历:Islamic-Umalqura(沙特阿拉伯)、Minguo(台湾)、ThaiBuddhist(仅在 1940 年之后正确)和 Japanese(自 1940 年以来)仅明治时代)。
如果Android开发者接受26级以上,那么Threeten-ABP显然是没有必要的。否则...
日本日历已在 v1.0.5 版本中修复。但伊斯兰日历仍然是一个负面的惊喜,因为它不是 Umalqura 变体,而是与微软科威特变体相当,并且只允许通过文件进行尴尬的配置(可以在 Android 上访问???)。所有日历的另一个大问题是缺乏任何本地化支持,例如:
HijrahDate hd = HijrahDate.now();
System.out.println(DateTimeFormatter.ofPattern("yyyy-MMMM-dd").format(hd)); // 1437-Juli-13
第七个伊斯兰月正确地称为“Rajab”,而不是“July”(撰写本文时我们现在是四月!)。正如之前所说,伊斯兰日可能会根据伊斯兰历的变体而变化,因此计算经常是错误的,这使得该库的整个伊斯兰历无法使用。
=> Joda-时间-Android https://github.com/dlew/joda-time-android
这是 Joda-Time 的包装。官方提供了8 个可插拔日历 http://www.joda.org/joda-time/cal.html。术语“可插拔”意味着,您可以选择“时间顺序”并配置类型的对象LocalDate
与这个年表。
如果您仔细研究提供的日历,那么您会发现真正的非 iso 日历(非公历)是:
- 泰国佛教(1940年后才正确)
- Coptic
- Ethiopic
- 伊斯兰(没有 Umalqura,而是四种算法变体)
- Julian
为了完整起见,还有一个桥接版本 http://www.joda.org/joda-time/cal_gj.html(对公历和儒略历规则之间的简单切换进行建模)。
但同样,本地化支持完全缺失,另请参阅这个老问题 https://github.com/JodaOrg/joda-time/issues/270。自从 Joda-Time 正式上线以来维护模式 http://www.joda.org/joda-time/,我们不能合理地期望任何进一步的发展:
请注意,Joda-Time 被认为是一个基本上“完成”的项目。
没有计划进行重大改进。如果使用 Java SE 8,请迁移
到 java.time (JSR-310)。
=> 我的图书馆Time4A https://github.com/MenoData/Time4A
这是最大的库(但是 Proguard 可以帮助缩小它)。它提供以下日历:
所有日历都提供广泛的 i18n 支持,主要基于 CLDR 数据。