如何将公历转换为中国农历?

2024-03-30

我想使用公历到中国农历构建一个Android应用程序。

我不知道如何从公历转换为农历。我怎样才能做到这一点?


从公历到中文的转换

我刚刚发布了Time4J的新版本(v4.35,但是使用Time4A https://github.com/MenoData/Time4A-v3.40-2018b(Android 上)),支持农历 http://time4j.net/javadoc-en/net/time4j/calendar/ChineseCalendar.html。从公历到中国阴阳历的转换可以直接完成:

PlainDate gregorian = PlainDate.nowInSystemTime(); // 2018-03-07
ChineseCalendar cc = gregorian.transform(ChineseCalendar.axis());
System.out.println(cc); // chinese[wu-xu(2018)-1-21]

中国日历的文档还包含如何以多种本地化方式格式化或解析它的示例。

Android 上显示的特殊设计要求

另请记住,中国历法包含公历中不存在的元素,例如循环年, 闰月 or 节气(我们天文季节的概括)。 Time4J/A 可以对其进行格式化,但它是特定于日历的。如果您考虑过通用日历显示,该显示应普遍适用于所有日历,那么这是相关的。最好在 Android 上为农历做一个特定的显示,这样其他重要信息(例如文本形式的循环年或节气)仍然可以显示。

与 ICU4J 的比较

主要区别:

  • API 风格:ICU4J 采用了旧世界java.util.Calendar而 Time4J/A 遵循领域驱动的方法
  • 不变性功能(与 Time4J/A 相比,ICU4J 日历类不是不变的)
  • 节气(ICU4J好像不支持这个功能)
  • 准确性(ICU4J使用基于Peter Duffet/Smith的书的天文学模块,而Time4J/A主要基于Jean Meeus的工作)

虽然有些人仍然喜欢 ICU4J 的老式风格,但我最担心的是 ICU4J 的准确性。作为参考,您可以观看发布的数据香港天文台 http://www.hko.gov.hk/gts/time/calendar/pdf/2018e.pdf2018年。ICU4J在2018年11月7日就已经与香港数据有偏差(整整一个月,日期误差了一天!)。使用以下代码证明:

DateFormat df = 
    DateFormat.getDateInstance(
        DateFormat.FULL, 
        ULocale.forLanguageTag("en-u-ca-chinese"));
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
sf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

ChineseCalendar cc = new ChineseCalendar(78, 35, 0, 0, 1);
System.out.println(df.format(cc.getTime())); // Friday, First Month 1, 2018(wu-xu)

for (int i = 0; i < 13; i++) {
    cc.add(Calendar.MONTH, 1);
    System.out.print(df.format(cc.getTime()));
    System.out.println("=>" + sf.format(cc.getTime()));
}

输出(注意11月份的行):

Saturday, Second Month 1, 2018(wu-xu)=>2018-03-17
Monday, Third Month 1, 2018(wu-xu)=>2018-04-16
Tuesday, Fourth Month 1, 2018(wu-xu)=>2018-05-15
Thursday, Fifth Month 1, 2018(wu-xu)=>2018-06-14
Friday, Sixth Month 1, 2018(wu-xu)=>2018-07-13
Saturday, Seventh Month 1, 2018(wu-xu)=>2018-08-11
Monday, Eighth Month 1, 2018(wu-xu)=>2018-09-10
Tuesday, Ninth Month 1, 2018(wu-xu)=>2018-10-09
Wednesday, Tenth Month 1, 2018(wu-xu)=>2018-11-07
Friday, Eleventh Month 1, 2018(wu-xu)=>2018-12-07
Sunday, Twelfth Month 1, 2018(wu-xu)=>2019-01-06
Tuesday, First Month 1, 2019(ji-hai)=>2019-02-05
Thursday, Second Month 1, 2019(ji-hai)=>2019-03-07

又见旧ICU4J 错误跟踪器上未解决的问题 http://bugs.icu-project.org/trac/ticket/10893,未来还有更多的日期是错误的。当然,天文计算无法以严格的方式预测未来,但 Time4J/A 第一次偏离香港数据的日期是 2057 年(计算为当地午夜后仅 37 秒),而不是像现在这样的 2018 年。 ICU4J。因此,只要 ICU4J 没有更正其天文学模块,甚至无法正确反映实际年份,我就会建议不要使用 ICU4J。

现实地说,在遥远的未来,我们不知道 2057 年谁是正确的,甚至香港天文台在这个日期也明确不确定:

如果是新月(农历初一)或节气的时间 接近午夜时,相关农历月或阳历的日期 “换算表”中的术语可能存在一天的差异。这样的 这种情况将发生在 2057 年 9 月 28 日的新月 [...]

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

如何将公历转换为中国农历? 的相关文章

随机推荐

  • 为什么添加“Eq”类型约束而不使用“==”?

    因此 我有一个非常简单的函数 它接受两个参数 第一个是一小时 0 到 23 之间 第二个是一分钟 0 到 59 之间 此函数返回小时加一分钟 并以漂亮的样式格式化小时 举例来说 hour 11 12 return 11 heures et
  • 使用 find_by_id 获取 RSpec 中不存在的记录时引发 RecordNotFound

    我在 products controller spec rb 中编写了此规范 旨在测试在不存在的记录上调用 destroy 时的重定向 it deleting a non existent product should redirect t
  • JavaScript+Phonegap+Android:screen.width 返回错误(几乎随机)值

    使用 deviceready 事件启动应用程序后 Android 上的 Phonegap 应用程序在 ZTE Blade 本机 800px 上返回错误的 screen width window innerWidth 相同 值 我得到的宽度值
  • Amazon AWS Fargate 任务静态 IP 地址

    在 AWS 上迁移期间 我在 AWS 上创建了一个新集群 并使用 Fargate 方法部署了多个 docker 应用程序 每次更新任务定义期间 都会在服务内启动新任务 并从 AWS 公共 IP 池分配新的公共 IP 有没有关于如何将静态 I
  • 如何更改 NSTimer 的计时?

    我有以下代码 timer NSTimer scheduledTimerWithTimeInterval 0 50 target self selector selector onTimer userInfo nil repeats YES
  • 在 ASP.NET MVC Web 应用程序中包含预编译视图

    在 ASP NET MVC Web 应用程序中包含预编译视图 参考 http ofps oreilly com titles 9781449320317 ch ReusableUI html 请参阅上面的博客 我正在尝试在 MVC 3 中创
  • LMAX Disruptor最简单、最实际的示例代码

    我希望我能得到最简单的示例代码 它将展示如何使用 LMAX Disruptor http code google com p disruptor 不幸的是 每一段代码都已经过时了 有人知道 我在哪里可以找到最新的小指南 最好没有 DSL 这
  • EntityFramework 同表多对多关系

    我有一个名为 产品 的表 其中显然包含产品 但是 我需要创建相关产品 所以我所做的就是创建一个名为product related 的连接表 它有两个PK ProductID 来自 Products 表 RelatedID 也来自 Produ
  • 我可以在 Android 开发中使用 javax.script 吗?如果可以,如何使用?

    我在包含 javax script 时遇到了一些麻烦在 Android 项目中 我需要它 这样我就可以在 JavaScript 中使用 eval 函数 以便有效地解析算术函数 而无需自己构建解析器 我在这方面完全没有经验 也没有很多时间 我
  • 确定我的 App Engine 代码正在哪个项目 ID 上运行

    在 App Engine 应用程序中 有没有办法确定 GAE App Engine 实例正在运行的项目 ID 我想访问运行 App Engine 实例的同一项目中的大型查询表 如果可能的话 我不想对其进行硬编码或将其包含在另一个配置文件中
  • Prolog 程序从列表中删除每个第 n 个元素

    您能帮我解决以下问题吗 编写三元谓词delete nth从列表中删除每个第 n 个元素 样本运行 delete nth a b c d e f 2 L L a c e false delete nth a b c d e f 1 L L f
  • JavaFX 2 自动列宽

    我有一个 JavaFX 2 表 显示人们的联系方式 假设有三列 名字 姓氏和电子邮件地址 当我的应用程序启动时 它会在表中填充有关系统中已有人员的几行数据 问题是列宽都是相同的 大多数时候 名字和姓氏会完整显示 但电子邮件地址会被剪掉 用户
  • 两个属性与一个实体共享相同的 OneToMany 关系 Symfony2

    首先描述一下我的情况 我正在使用 Symfony2 但我的实体之间的关系存在问题 我有两个链接在一起的实体 这两个实体是AssociationQuestion and AssociationPossibleAnswer 我目前正在创建一个调
  • Java && ||在 RETURN 语句中?

    我正在查看一些 Java 算法示例 并且在递归方法中遇到了以下代码片段 boolean subTree TreeNode t1 TreeNode t2 if t1 null return false if t1 value t2 value
  • 如何检查浏览器对功能/事件的支持?

    过去 我们使用浏览器嗅探来推断某些事件或功能是否可用 据我所知 浏览器嗅探已被 弃用 或 回避 取而代之的是功能嗅探 我想知道如何检查是否可以处理某个事件 Take DOMNodeInserted例如 Chrome FF 和 Safari
  • 地图首次加载时如何自动打开地图上的注释标注?

    我正在开发一个基于 iPhone 的导航应用程序 它允许用户在地图上查看表格中的选择 我有一个注释可以精确定位用户在地图上选择的位置 按照正常行为 如果用户单击注释 则会出现一个标注 其中包含有关位置的详细信息 这里没有问题 我的问题是 一
  • Lime的R版本可以用count:poisson目标函数解释xgboost模型吗?

    我使用 xgb train 和 count poisson 目标函数生成了一个模型 在尝试创建解释器时出现以下错误 Error Unsupported model type 当我用其他东西 例如 reg logistic 替换目标时 Lim
  • HTML CSS 表单 - 如何使表单在​​页面上居中?

    我制作了一个表单 试图将其置于页面中心 但它不起作用 我尝试将这 2 个 CSS 应用于它 但没有成功 form margin 0 auto form margin auto 我还尝试将表单封装到 div container 中并对其应用相
  • 下载 ASP.NET MVC C# 中字节数组列表中包含的多个文件

    我正在开发一个 ASP NET MVC 5 应用程序 我编写了一个代码 允许我下载存储在 SQL Server 数据库中的文件 varbinary 我可以使用以下命令下载单个文件 public JsonResult PrepareSingl
  • 如何将公历转换为中国农历?

    我想使用公历到中国农历构建一个Android应用程序 我不知道如何从公历转换为农历 我怎样才能做到这一点 从公历到中文的转换 我刚刚发布了Time4J的新版本 v4 35 但是使用Time4A https github com MenoDa