Android 使用非公历

2024-05-09

我正在创建一个DatePickerDialogFragment用户将在其中选择出生日期。我想确保我可以处理非公历日期。我无法更改在我的设备上使用的日历类型。 Android 是否允许用户切换日历类型?如果是的话,步骤是什么?到目前为止我还没有设置成功。


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

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 可以帮助缩小它)。它提供以下日历:

  • Badi

  • 中文(自 1645 年起)

  • Coptic

  • Dangi(古朝鲜语)

  • 埃塞俄比亚(早上 6 点作为一天的开始)

  • 法国共和派

  • 希伯来语(以日落为一天的开始)

  • 印度教(由 Dershowitz/Reingold 给出的变体)

  • 历史基督教(许多可配置的变体)

  • 印度语(萨卡语)

  • 伊斯兰(Umalqura-沙特阿拉伯、Diyanet-土耳其、8 种算法变体、ICU 模拟、可定制的日期调整、日落作为一天的开始)

  • 日语(自明治6年以前的中年起也有日月部分)

  • 主体思想(朝鲜)

  • Julian

  • 民国(台湾)

  • Persian

  • ThaiSolar(1941 年之前也有效)

  • 越南语

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 使用非公历 的相关文章

  • Android 4.4.2 - java.lang.RuntimeException:执行未恢复的活动停止

    我在 4 4 2 设备上遇到此异常 在 Android 4 3 或更低版本的设备上无法重现 设置是我有一个家庭活动 支持的子类ActionBarActivity 家庭活动检查布尔标志 如果为真 则启动启动画面活动 是的 理想情况下启动画面出
  • 单击弹出菜单时为什么导航栏出现在全屏应用程序中

    我有一个全屏应用程序 MainActivity java public class MainActivity extends AppCompatActivity TargetApi Build VERSION CODES KITKAT pr
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android Studio 3.0.0 不允许 DOCTYPE

    升级到Android Studio 3 0 0 同步并更新gradle插件 出现以下错误 Error DOCTYPE not allowed if function http apache org xml features disallow
  • 强制用户在 Android 中的 EditText 中输入内容

    我的活动中有几个编辑文本 我希望我的用户在提交表单之前正确输入 我该怎么做 我还有旋转器和 RadioGroup 按钮 你可以加验证在提交按钮上单击 private boolean validateFields int yourDesire
  • 使用库来维护免费/付费的应用程序版本

    维护免费 付费应用程序版本的共识似乎是使用库 并从每个活动中设置一个标志 以从代码库中获取不同的功能 这有多安全 据我了解 一个人可以root他们的手机 获取APK 并且可以对其进行反编译 即使代码被混淆 也不难看出该应用程序是带有标志的包
  • 安卓无法玩ogg

    有人知道这是什么意思吗 ogg使用phonegap is Media播放 它使用MediaPlayer 05 26 15 41 50 007 1160 3631 E AudioFlinger no more track names avai
  • ProGuard 无法与 Windows 中使用的 Joda Time 一起编译

    实际上 这是一个答案 而不是一个问题 我确实在 Windows 上花了很多时间 使用 JodaTime 并使用 ProGuard 将其包含在我的 Android 项目中 混淆器配置 libraryjars C Users Reto Docu
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 如何以编程方式断开拨出呼叫

    我使用以下代码以编程方式断开呼叫 但它不起作用 private void callDisconnect try TelephonyManager manager TelephonyManager this getSystemService
  • 应用内结算错误

    我的 UNMANAGED 应用内购买无法正常工作 在它完美运行之前 我可以使用测试帐户成功购买 但它突然不起作用了 因为我记得我对商家帐户所做的只是添加更多 2 4 个测试帐户 添加后 我的应用内购买将不起作用 所以我更新了公钥并上传了一个
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • finish() 完成活动但它仍然在后台

    我有一个关于 android studio 中活动的 finish 方法的问题 我有这个简单的代码 public class MainActivity extends AppCompatActivity Override protected
  • 从 TextView 中显示的数字中删除小数点[重复]

    这个问题在这里已经有答案了 对于我的简单计算器 我将结果显示在TextView 但它总是显示小数 我怎样才能删除它们 这是我的代码 public class MainActivity extends Activity implements
  • 为什么Android应用程序在发布到市场后尺寸会增加?

    我最近在 Android 市场上发布了我的应用程序 显示应用程序大小为 5 4MB 而实际 apk 大小为 2 8MB 为什么显示多出2MB 我应该如何限制我的应用程序大小 请帮我 您的应用程序大小会增加 因为您使用了复制保护选项ON在发布
  • 在Android Studio中更改项目主题?

    我使用浅色主题创建了一些项目 现在我想将其更改为深色 但我不知道该怎么做 顺便说一句 我不是问如何在代码中做到这一点 只是问如何更改项目的默认主题 在 AndroidManifest xml 的 application 标签下 您可以设置您
  • Nexus 7 (2013) 和 Win 7 64 - 尽管检查了许多论坛和在线资源,仍无法安装 USB 驱动程序

    我正在尝试设置 Nexus 7 2013 进行调试 但我在安装 USB 驱动程序的步骤中陷入困境 到目前为止 这是我尝试过的 采取的步骤 在 Nexus 7 2013 上打开调试模式 连接设备至 PC 下载 Google USB 驱动程序于
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 在没有 Wifi 的情况下获取 Android 设备的 MAC 地址

    如何获取没有 Wifi 接口的 Android 设备 例如 Android 模拟器 的网络接口的 MAC 地址 通过WifiManager返回获取的WifiInfonull EDIT 更清楚地说 我必须与本地网络上的现有网络协议 不是我设计

随机推荐

  • 如何在createQueryBuilder中使用通配符?

    在我的存储库类中 我使用 public function getItemsByTag tag qb this gt createQueryBuilder c gt select c gt where c tags LIKE bipolar
  • 在 OpenXML 中应用数字格式

    我正在尝试使用 OpenXML 从头开始 创建 Excel 电子表格 并且一切正常 将实际值转储到实际单元格中 但现在我正在尝试将数字格式应用于列 但遇到了问题 我有styles xml看起来像这样
  • 如何使盒子阴影显示在容器中的下一个元素上?

    请看这段代码 http codepen io Varin pen kkGgVd http codepen io Varin pen kkGgVd div class container div class outside2 div clas
  • 使用 php 变量更改 css 类

    这里需要您的帮助 正如标题所示 我正在尝试使用 PHP 变量更改 css 类 所以基本上我想创建一个回显某些代码的循环 但我希望第一个循环中的 div 类有所不同 它应该被隐藏 这是我为使问题变得清晰而编写的简化代码 我不知道错误在哪里 请
  • 如何在odoo中重写js函数

    我想加载 shop checkout url 函数是 odoo define change info order website sale change info order function require use strict oe w
  • 如何在 Angular 2 中订阅 DOMContentLoaded 事件?

    我正在将 UI 主题从 Angular 1 移植到 Angular 2 在第 1 个版本中 我有 viewContentLoaded事件 我想将其重新制作为 Angular 2 我正在尝试使用 HostListener DOMContent
  • 使用 Swift 解析框架

    有人尝试过将 Parse Framework 与 swift 一起使用吗 只要添加桥接文件 您就可以使用 swift 和 Objective C 代码 这是我的查询 从 Parse 返回的 对象 数组正确地包含了我的所有数据 但该方法在将
  • 为什么 .each 在我的 Rails 视图中完成后会重复数组? [复制]

    这个问题在这里已经有答案了 在我的 Rails 视图页面中 我有以下循环 它应该循环遍历我的 tag list 数组并打印每个标签 由于某种原因 它在打印每个单独的标签后会重复该数组 例如 这个数组有两个元素 ruby python 每个方
  • 使用 CDI+JSF 使会话失效不起作用

    我正在尝试在我的应用程序中实现注销 所以我这样做了 public String logout try FacesContext facesContext FacesContext getCurrentInstance ExternalCon
  • NV_path_rendering替代方案[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚观看了 Siggraph 2012 的一个非常令人印象深刻的演示 http nvidia fullviewmedia com sig
  • addEventListener keydown 不起作用

    我在互联网上找到了一些基本的 Pong 代码 并尝试添加按键 代码在这里 http cssdeck com labs ping pong game tutorial with html5 canvas and sounds http css
  • Selenium Python 使用代理运行浏览器[重复]

    这个问题在这里已经有答案了 我正在尝试编写一个非常简单的脚本 该脚本从 txt 文件获取代理 不需要身份验证 并用它打开浏览器 然后沿着代理列表循环此操作一定次数 我确实知道如何打开 txt 文件并使用它 我的主要问题是让代理正常工作 我见
  • Google 地图 api 中的 infoWindow 数组

    我寻找错误 但找不到它 由于某种原因 任何谷歌地图信息窗口总是显示相同的信息 这是一个咖啡脚本代码 infowindow new google maps InfoWindow for company in companiesData mar
  • 使用 OpenLayers 动态添加自定义标记到地图

    我想让用户在地图上添加自定义标记以及每个标记的描述 任何提示 任何教程的链接都会非常有用 您可以注册一个函数来在地图上 点击 事件 当用户单击它时 会自动添加该标记 尝试这样的事情 map is your map created using
  • 使用 PowerShell 检查 AD 中是否存在组

    我想为该组创建代码来检查该组是否存在 但是 我无法开始工作 因为它成功地将用户和组的部分成员仅添加到一个组中 而不是其他组 因为我设法在活动目录中创建一个组并从 csv 中读取 这是我的代码和结果 似乎在成功添加用户并添加组成员后我总是收到
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t
  • git stash 和编辑帅哥

    我完全喜欢git add p and git stash但我偶尔会遇到以下问题 该问题是通过以下命令序列重现的 git add p my file 然后我手动编辑大块 using e 因为 git 建议的分割不适合我 git stash k
  • 如何在 yii 中设置 cron 作业

    我是 yii 的新手 我正在做一个项目 我写了一个向客户发送自动提醒的功能 假设这个函数位于 url http somedomain com index php somecontroller someaction 我想为此网址设置 cron
  • python中匹配3个或更多相同的字符

    我正在尝试使用正则表达式在字符串中查找三个或更多相同的字符 例如 你好 不匹配 噢 会的 我尝试过做类似的事情 re compile 1 3 a zA Z re compile w 1 5 但似乎都不起作用 w 1 2 是您正在寻找的正则表
  • Android 使用非公历

    我正在创建一个DatePickerDialogFragment用户将在其中选择出生日期 我想确保我可以处理非公历日期 我无法更改在我的设备上使用的日历类型 Android 是否允许用户切换日历类型 如果是的话 步骤是什么 到目前为止我还没有