Android 中的埃塞俄比亚日历

Posted

技术标签:

【中文标题】Android 中的埃塞俄比亚日历【英文标题】:Ethiopian calendar in Android 【发布时间】:2021-11-08 19:19:00 【问题描述】:

我正在为一家埃塞俄比亚公司开发 android 应用程序,并且必须处理日期。

埃塞俄比亚使用的日历与公历类似,但有两个主要区别:它设置为大约 10 分钟。 7年前,有13个月。 在我发布此问题时,公历日期为 13-09-2021,埃塞俄比亚日历日期为 03-01-2014。

我的问题是:

Android 是否支持埃塞俄比亚日历?埃塞俄比亚人是否习惯让他们的设备使用它?

如果是这样,我是否必须获取默认格式化程序(使用默认日历:Calendar.getInstance())才能正确格式化日期?

相反,如果设备使用公历,Java 如何支持转换为埃塞俄比亚日期?

为了模拟完整的场景,你会建议什么设备设置正确的当前埃塞俄比亚日期(好像来自网络提供商)和区域设置?

【问题讨论】:

通过一些快速的谷歌搜索,埃塞俄比亚日历基于科普特日历,我在这里找到了文档:developer.android.com/reference/android/icu/util/CopticCalendar。这有帮助吗? 除了今天的埃塞俄比亚日期是 03.01.2014 而不是 03.09.2014。我在 3 天前庆祝了新年 :-) 您可能知道这一点,但我还是要把它放在这里——我强烈建议您将日期内部保留为 UTC 时间,然后在显示它们时进行转换。这将使您的应用程序更容易调试,并且与它可能需要使用的第三方应用程序更兼容。将展示的想法与存储分开。 @qwlice 即使在今天,埃塞俄比亚的埃塞俄比亚人也使用埃塞俄比亚历法。在官方文件、报纸、电视等中,仅使用埃塞俄比亚日历。在商业领域,尤其是在科技领域,工作语言是英语,大多数埃塞俄比亚人都知道公历,并且每天都会专业地使用它。另一方面,厄立特里亚自独立以来就采用了公历。在厄立特里亚,埃塞俄比亚日历只供老年人和教堂使用。对于我和欧洲的其他人来说,这只是作为庆祝圣诞节和新年两次的理由。 除非日期和时间在您的应用程序中发挥重要作用,否则在我看来,从一个转换到另一个的能力是一个不错的功能,而不是必须具备的功能。请注意,埃塞俄比亚人对一天中的时间也有不同的方法。这一天不是从午夜开始,而是从早晨的日出开始。当西方世界早上 7 点吃早餐时,这只是埃塞俄比亚一天的第一个小时。 【参考方案1】:

虽然我对这些日历系统一无所知,但也许……

ThreeTen-Extra

ThreeTen-Extra 库添加到您的项目以访问插入到Android 捆绑的java.time 框架中的EthiopicChronology 类。

这个年表定义了埃塞俄比亚历法系统的规则。该日历系统主要用于埃塞俄比亚。日期对齐,因此 0001-01-01(埃塞俄比亚)是 0284-08-29(ISO)。

您也可以在那里找到CopticChronology 课程。

【讨论】:

太酷了!我也期待 Ole 或 Meno 提供使用 Time4J 库的解决方案。 记录在案的从埃塞俄比亚第 1 年到公历 284 年的转换是不正确的。考虑到 Amute-Mihret 时代,只有大约七年的差异。准确:(English - "Year of Grace") is used for current years >= 1 and starts at AD-8-08-29 (Julian calendar)【参考方案2】:

关于历法背景:

Ethiopian calendar 是一个在埃塞俄比亚本身颇受欢迎的地方日历。是的,这个国家甚至还有一种特殊的计时模式,从早上 6 点开始。但是,由于Android、ios或Windows等常见操作系统缺乏足够的支持,我不确定日历是否也在手机上广泛使用。在埃塞俄比亚以外,它可能只与散居国外的有宗教信仰的埃塞俄比亚人有关。

Android 支持:

您可以找到 IBM 提供的 EthiopicCalendar 类提供的一些支持。我强烈认为支持阿姆哈拉语数字(但不完全确定)。我对支持早上 6 点作为一天的开始并计为零(如果您询问当前日期,则相关)的信心不足。 IBM 说(与Calendar.getInstance() 的标准用法相似但不完全相同):

EthiopicCalendar 通常应该使用实例化 Calendar.getInstance(ULocale) 传入带有标签的 ULocale “@calendar=埃塞俄比亚”。

IBM 的 API 通过计算自 1970-01-01T00:00Z 以来的毫秒数,提供到公历的转换,反之亦然。对于格式化或解析,请使用专用的formatter engine of IBM。注意,它不是 Android 的标准格式化引擎。当然,您仍然需要担心一些奇怪的功能,例如将第一个月视为零(而不是一)。

替代库 Time4A:

我的库 Time4A 也是为 Android 编写的,是主库 Time4J 的姊妹项目。这两个库都包含EthiopianCalendar 和EthiopianTime 类。您将在 javadoc 中找到一些代码示例。也支持非十进制 Amharic numbers。这些类也需要一个特殊的格式化引擎,称为ChronoFormatter。与 IBM 一样,埃塞俄比亚月份名称如 Meskerem(即使是阿姆哈拉语或其他语言)也得到了很好的支持。

到公历的转换(反之亦然)可以通过表达式ethiopianDate.transform(PlainDate.axis()) 获得,其中参数表示目标日历(这里,PlainDate 是公历类型)。

【讨论】:

以上是关于Android 中的埃塞俄比亚日历的主要内容,如果未能解决你的问题,请参考以下文章

android中的日历事件和alarmManager服务

Android 中的日历视图

如何使用android中的回收器视图将事件放在日历中[重复]

如何使用 android 使用日历 API 在谷歌日历上添加事件?

良心!这款Android 7.0手机直升Android 9

收集几个Android CalendarView非常用属性