Android使用非公历日历

Mik*_*ker 2 android calendar gregorian-calendar datepickerdialog

我正在创建一个DatePickerDialogFragment用户选择出生日期的地方.我想确保我能处理非格里高利的日期.我无法更改要在我的设备上使用的日历类型.Android是否为用户提供了切换日历类型的功能?如果是这样,步骤是什么?到目前为止,我在设置方面没有成功.

Men*_*ild 6

关于非格里历日历的选择器对话框的图形用户界面,您必须自己从头开始实现它.以下说明是关于其他日历的一般可用性.

API级别24之前的Android旧状态

那么,我们在这里看到(再次)Oracle和Android之间的区别.如果您查看较旧的Android代码来源,那么您只会看到实例化的格里高利历:

991     public static synchronized Calendar getInstance() { 
992         return new GregorianCalendar(); 
993     } 
Run Code Online (Sandbox Code Playgroud)

这与Oracle-Java所做的相反,其中基于java.util.Calendar(可通过locale或unicode-ca-extension选择)描述两个替代日历:ThaiBuddhist(仅在1940年之后正确)和JapaneseImperial(自Meji时代以来).

Android的当前状态(在2017-05-03上更新)

然而,从API级别24(Android-N)开始,谷歌推出了新的日历,从ICU4J项目中取代.这些日历可以在android.icu.util包中找到:

  • 佛教徒(仅在1940年之后才正确)
  • 中文(有准确性问题)
  • 科普特
  • 衣索比亚
  • 希伯来语
  • 印度(萨卡)
  • 伊斯兰教(4种变体)
  • 日语(仅限现代使用)
  • 台湾(民国)

备择方案?

实际上,主要有三个第三方图书馆承诺提供替代日历.

=> Threeten-ABP

这是围绕Java-8内置的新时间库的后端的薄包装,它引入了4个部分新的日历:伊斯兰 - 乌玛古拉(沙特阿拉伯),民国(台湾),泰国佛教(仅在1940年之后正确)和日本(从那以后)只有明治时代).

一般来说,Android已宣布推出java.time具有Android-O(API级别25)的Java-8类(包).如果Android开发者只接受这个级别,那么Threeten-ABP显然是不必要的.除此以外...

日语日历已在版本v1.0.5中修复.但伊斯兰历法仍然是一个负的惊喜,因为它不是Umalqura变,而是堪比微软科威特变种,只允许通过一个文件一个尴尬的配置(在Android访问???).所有日历的另一个大问题是缺乏任何本地化支持,例如:

HijrahDate hd = HijrahDate.now();
System.out.println(DateTimeFormatter.ofPattern("yyyy-MMMM-dd").format(hd)); // 1437-Juli-13
Run Code Online (Sandbox Code Playgroud)

第7个伊斯兰月被正确地称为"Rajab",而不是"7月"(我们现在在写这篇文章的时候是4月!).如前所述,伊斯兰日可能因伊斯兰日历的变体而异,因此计算通常是错误的,这使得该库的整个伊斯兰日历无法使用.


=> Joda-Time-Android

这是Joda-Time的包装.它正式提供8个可插拔日历.术语"可插入"意味着,您可以选择"年表"并LocalDate使用此年表配置类型对象.

如果您仔细研究提供的日历,那么您将看到真正的非等值日历(非格里高利)是:

  • ThaiBuddhist(仅在1940年之后更正)
  • 科普特
  • 衣索比亚
  • 伊斯兰教(没有Umalqura,而是四种算法变体)
  • 朱利安

为了完整性,还有一个桥版本(在格里高利和朱利安日历规则之间建模一个简单的切换).

但同样,本地化支持完全缺失,请参阅此旧问题.由于Joda-Time正式处于维护模式,我们无法合理地期待任何进一步的发展:

请注意,Joda-Time被认为是一个很大程度上"完成"的项目.没有计划重大改进.如果使用Java SE 8,请迁移到java.time(JSR-310).


=>我的图书馆Time4A

这是最大的图书馆(Proguard可以帮助缩小它).它提供以下日历:

  • 中文(自1645年起)
  • 科普特
  • Dangi(老韩国人)
  • 衣索比亚
  • 法国共和党人
  • 希伯来语
  • 历史基督教(许多可配置的变体)
  • 印度(萨卡)
  • 伊斯兰教(Umalqura-Saudi-Arabia,Diyanet-Turkey,8种算法变体,ICU模拟,可定制日调整)
  • 日本人(自明治6月中旬以来也有月球部分)
  • 主体(朝鲜)
  • 朱利安
  • 民国(台湾)
  • 波斯语
  • ThaiSolar(1941年之前也有效)
  • 越南

所有日历都基于CLDR数据提供广泛的i18n支持.