我正在创建一个DatePickerDialogFragment
,用户将在其中选择出生日期。我想确保我能处理非格里高利的日期。我无法更改要在我的设备上使用的日历类型。 Android是否为用户提供了切换日历类型的功能?如果是这样,步骤是什么?到目前为止,我在设置方面没有成功。
答案 0 :(得分:6)
关于非格里历日历的选择器对话框的图形用户界面,您必须自己从头开始实现它。以下说明是关于其他日历的一般可用性。
好吧,我们在这里看到(再次)Oracle和Android之间的区别。如果您查看source of older Android code,那么您只会看到实例化的格里高利历:
991 public static synchronized Calendar getInstance() {
992 return new GregorianCalendar();
993 }
这与Oracle-Java在java.util.Calendar
基础上描述两个替代日历的情况形成对比(可通过locale或unicode-ca-extension选择): ThaiBuddhist (仅限1940年后更正)和日本帝国(自Meji时代以来)。
然而,从API级别24(Android-N)开始,Google推出了新的日历,超过了ICU4J项目。这些日历可以在包android.icu.util中找到:
新的java.time
- API已经推出,因此已经合并了四个非格里历的日历:
实际上,主要有三个第三方库,它们承诺为旧版本的Android版本提供替代日历。
<强> =&GT; Threeten-ABP 强>
这是围绕Java-8内置的新时间库的后端的薄包装,它引入了4个部分新的日历:伊斯兰 - 乌玛古拉(沙特阿拉伯),民国(台湾),泰国佛教(仅在1940年之后正确)和日语(仅限于Meji时代)。
如果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
第7个伊斯兰月被正确地称为“Rajab”,而不是“7月”(我们现在在写这篇文章的时候是4月!)。如前所述,伊斯兰日可能因伊斯兰日历的变体而异,因此计算通常是错误的,这使得该图书馆的整个伊斯兰日历无法使用。
<强> =&GT; Joda-Time-Android 强>
这是Joda-Time的包装。它正式提供8 pluggable calendars。术语“可插入”表示您可以选择“年表”并使用此年表配置类型为LocalDate
的对象。
如果您仔细研究提供的日历,那么您将看到真正的非等值日历(非格里高利):
为了完整性,还有一个bridge version(在格里高利和朱利安日历规则之间建模一个简单的转换)。
但同样,本地化支持完全缺失,另请参阅this old issue。由于Joda-Time正式出现在maintenance mode,我们无法合理地期待任何进一步的发展:
请注意,Joda-Time被认为是一个很大程度上“完成”的项目。 没有计划重大改进。如果使用Java SE 8,请迁移 到java.time(JSR-310)。
<强> =&GT;我的图书馆Time4A
这是最大的图书馆(Proguard可以帮助缩小它)。它提供以下日历:
所有日历都提供广泛的i18n支持,主要基于CLDR数据。
答案 1 :(得分:2)
Android似乎不支持任何其他日历。实际上,Calendar
类只有一个直接子类:GregorianCalendar
。
请参阅Calendar类的Android API参考。
要支持DatePickerDialogFragment
中的其他日历,您必须自己实施。