Android使用非公历日历

时间:2016-04-21 13:38:45

标签: android calendar gregorian-calendar datepickerdialog

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

2 个答案:

答案 0 :(得分:6)

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

Android级别2​​4之前的旧状态

好吧,我们在这里看到(再次)Oracle和Android之间的区别。如果您查看source of older Android code,那么您只会看到实例化的格里高利历:

991     public static synchronized Calendar getInstance() { 
992         return new GregorianCalendar(); 
993     } 

这与Oracle-Javajava.util.Calendar基础上描述两个替代日历的情况形成对比(可通过locale或unicode-ca-extension选择): ThaiBuddhist (仅限1940年后更正)和日本帝国(自Meji时代以来)。

Android-N(API级别24)

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

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

Android的当前状态(API级别26或更高)

新的java.time - API已经推出,因此已经合并了四个非格里历的日历:

  • Islamic-Umalqura(沙特阿拉伯)
  • 日语(仅限于Meji时代,从1872年开始)
  • 民国(台湾)
  • ThaiBuddhist(仅在1940年之后更正)

替代?

实际上,主要有三个第三方库,它们承诺为旧版本的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的对象。

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

  • ThaiBuddhist(仅在1940年之后更正)
  • 科普特
  • 埃塞俄比亚语
  • 伊斯兰教(没有Umalqura,而是四种算法变体)
  • 儒略

为了完整性,还有一个bridge version(在格里高利和朱利安日历规则之间建模一个简单的转换)。

但同样,本地化支持完全缺失,另请参阅this old issue。由于Joda-Time正式出现在maintenance mode,我们无法合理地期待任何进一步的发展:

  

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

<强> =&GT;我的图书馆Time4A

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

  • 巴迪
  • 中文(自1645年起)
  • 科普特
  • Dangi(老韩国人)
  • Ethiopic(早上6点开始)
  • 法国共和党人
  • 希伯来语(日落作为一天的开始)
  • 历史悠久的基督徒(许多可配置的变体)
  • 印度(萨卡)
  • 伊斯兰教(Umalqura-Saudi-Arabia,Diyanet-Turkey,8种算法变体,ICU模拟,可定制日调整,日落作为一天的开始)
  • 日本人(自明治6月中旬以来也有月球部分)
  • Juche(朝鲜)
  • 儒略
  • 民国(台湾)
  • 波斯
  • ThaiSolar(1941年之前也有效)
  • 越南

所有日历都提供广泛的i18n支持,主要基于CLDR数据。

答案 1 :(得分:2)

Android似乎不支持任何其他日历。实际上,Calendar类只有一个直接子类:GregorianCalendar

请参阅Calendar类的Android API参考。

要支持DatePickerDialogFragment中的其他日历,您必须自己实施。