ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 27173|回复: 94

[分享] 农历计算程序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-2-14 11:52 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 zopey 于 2019-3-15 16:04 编辑

农历计算程序,按中气置闰,能力有限,错误难免。
农历置闰.zip (96.33 KB, 下载次数: 86)

发现一些错误,修订版本 V1.20:
1、农历初一日期 的计算错误;2、2033年 闰7月、闰11月的 问题也已修正。
农历置闰V1.20.rar (96.5 KB, 下载次数: 65)
修订版本 V2.0:
1、修正19楼提到的bug,自己测试了2014年,6402年 闰月OK,2、增加皇帝年号。
3、A1格 年份,修改范围 -4700年 至9999 年,点击按钮生成 当年农历(未做历史修正)。
农历置闰V2.0.zip (165.64 KB, 下载次数: 113)
修订版本 V3.0:
1、皇帝纪年 从夏朝开始(参考 夏商周断代工程)。
2、历史修正(参考 寿星天文历的拟合数据)。
农历置闰V3.0.zip (267.53 KB, 下载次数: 692)




评分

11

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-2-14 15:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼主,做的还是很不错的

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-15 09:04 | 显示全部楼层
历史上的今天  (验证资料)

《中苏友好同盟互助条约》在莫斯科签订
  在69年前的今天,1950年2月14日 (农历腊月廿八ok),《中苏友好同盟互助条约》在莫斯科签订。

中国首次派团参加冬季奥运会
  在39年前的今天,1980年2月13日 (农历腊月廿七ok),中国首次派团参加冬季奥运会。

清帝退位,封建君主制结束
  在107年前的今天,1912年2月12日 (农历腊月廿五ok),清帝退位,封建君主制结束。

“怀仁堂碰头会”被定性为“二月逆流”
  在52年前的今天,1967年2月11日 (农历正月初三ok),“怀仁堂碰头会”被定性为“二月逆流”。

河北公审大贪污犯刘青山、张子善
  在67年前的今天,1952年2月10日 (农历正月十五ok),河北公审大贪污犯刘青山、张子善。

汉朝名将霍去病出生
  在2159年前的今天,前140年2月9日 (农历腊月廿七??),汉朝名将霍去病出生。

日俄战争爆发
  在115年前的今天,1904年2月8日 (农历腊月廿三ok),日俄战争爆发。

越南蓝山起义
  在601年前的今天,1418年2月7日 (农历正月初二ok),越南蓝山起义。

国务院发布《关于推广普通话的指示》
  在63年前的今天,1956年2月6日 (农历腊月廿五ok),国务院发布《关于推广普通话的指示》。

解放军“第一大将”粟裕逝世
  在35年前的今天,1984年2月5日 (农历正月初四ok),解放军“第一大将”粟裕逝世。

邓颖超诞辰
  在115年前的今天,1904年2月4日 (农历腊月十九ok),邓颖超诞辰。

杰出的经济、军事政治工作领导者余秋里逝世
  在20年前的今天,1999年2月3日 (农历腊月十八ok),杰出的经济、军事政治工作领导者余秋里逝世。

中共中央提出“全国大跃进”的口号
  在61年前的今天,1958年2月2日 (农历腊月十四ok),中共中央提出“全国大跃进”的口号。

郑成功收复台湾
  在357年前的今天,1662年2月1日 (农历腊月十三ok),郑成功收复台湾。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-15 15:01 | 显示全部楼层
农历“头尾法”算点
     以农历的除夕春节为交接点,计算结果表征的是一个完整的干支年:从农历正月初一起到腊月底的除夕日止。


农历年
    是按农历年头年尾作为交接点,即农历除夕之前为前一年干支,春节即正月初一起为新一年干支。   

农历月干支:
  确定农历月纪称之为“建月”,地支是:,以正月为寅(曰“建寅”,寅起丑止,固定不变。

      月干支其月头至月尾为同一干支,闰月干支与前月干支同。




TA的精华主题

TA的得分主题

发表于 2019-2-16 02:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主的程序做的很棒!
2033年的闰月...

TA的精华主题

TA的得分主题

发表于 2019-2-16 10:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
      农历是以无中气之月为闰月的,但在2033年中的8月25日、12月22日和2034年2月19日起的农历月份中都没有中气,为什么没有先闰2033年的8月25日所在交朔月而闰12月22日所在的交朔月?

       这是因为农历是以冬至所在月为十一月(真正的农历年度的界定从冬至起,即必须保证冬至在农历的非闰11月),从上一年的冬至月到本年的冬至(不含)期间所含的交朔次数即为月数。2032年冬至到2033年冬至之间只有12次交朔,就不需设置闰月;2033年冬至到2034年冬至有13次交朔,因此必须置闰,而2033年冬至后的第一个无中气之月就是2033年12月22日的交朔,所以就定为闰11月;后面的2034年2月19日交朔月无中气就不再设置闰月。

TA的精华主题

TA的得分主题

发表于 2019-2-16 10:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请参考
3000年闰月表.rar (42.35 KB, 下载次数: 143)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-16 12:44 | 显示全部楼层
YZC51 发表于 2019-2-16 10:41
农历是以无中气之月为闰月的,但在2033年中的8月25日、12月22日和2034年2月19日起的农历月份中都没有 ...

http://club.excelhome.net/thread-1457643-1-1.html  3楼 计算初一(合塑时刻)的代码,应该是正确的。

  1. ‘求解农历初一

  2. Function getjq_12(yy, mm)
  3. W = (mm + (yy - 2000) * 12) * pai * 2

  4. Do
  5.     jd0 = jd1
  6.     stDegree = moon_L(jd0) - earth_L(jd0) - W
  7.     stDegreep = (moon_L(jd0 + 0.000005) - earth_L(jd0 + 0.000005) - moon_L(jd0 - 0.000005) + earth_L(jd0 - 0.000005)) / 0.00001
  8.     jd1 = jd0 - stDegree / stDegreep
  9. Loop Until Abs(jd1 - jd0) < 0.0000001

  10. getjq_12 = JD2GL(jd1 + 8 / 24 - deltatT(yy) / 86400)
  11. End Function
复制代码



我在这里修改为

  1. Function getjq_12(jda)

  2. jd1 = jda
  3. W = Int((moon_L(jda) - earth_L(jda)) / (pai * 2)) * pai * 2
  4. Do
  5.    jd0 = jd1
  6.    stDegree = moon_L(jd0) - earth_L(jd0) - W
  7.    stDegreep = (moon_L(jd0 + 0.000005) - earth_L(jd0 + 0.000005) - moon_L(jd0 - 0.000005) + earth_L(jd0 - 0.000005)) / 0.00001
  8.    jd1 = jd0 - stDegree / stDegreep
  9. Loop Until Abs(jd1 - jd0) < 0.0000001

  10. getjq_12 = jd1 + 8 / 24 - deltatT(yy) / 86400

  11. End Function
复制代码
两者结果不一致,出现误差,使得初一日期 定不准 ,要在这里找找原因。



TA的精华主题

TA的得分主题

发表于 2019-2-16 13:45 | 显示全部楼层
zopey 发表于 2019-2-16 12:44
http://club.excelhome.net/thread-1457643-1-1.html  3楼 计算初一(合塑时刻)的代码,应该是正确的。
...

3楼的合塑时刻的代码很正确!
看来是置闰规则的问题。
当两个冬至之间有13个月时置闰,并且是冬至后的第一个无中气为闰月,还要保证冬月落在冬至上!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-16 16:59 | 显示全部楼层
zopey 发表于 2019-2-16 12:44
http://club.excelhome.net/thread-1457643-1-1.html  3楼 计算初一(合塑时刻)的代码,应该是正确的。
...

8楼 第2段代码:
getjq_12 = jd1 + 8 / 24 - deltatT(yy) / 86400

当中的 yy没有定义为2033年,默认值为0. 所以产生误差。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 10:50 , Processed in 0.040078 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表