ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: zopey

[分享] 农历计算程序

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-18 11:52 | 显示全部楼层
  1. Function getjq_12(yy, jda)
  2. k0 = Round((moon_L(jda) - earth_L(jda)) / (pai * 2), 0)

  3. jd1 = jda
  4. W1 = (k0 - 1) * pai * 2
  5. Do
  6.    jd0 = jd1
  7.    stDegree = moon_L(jd0) - earth_L(jd0) - W1
  8.    stDegreep = (moon_L(jd0 + 0.000005) - earth_L(jd0 + 0.000005) - moon_L(jd0 - 0.000005) + earth_L(jd0 - 0.000005)) / 0.00001
  9.    jd1 = jd0 - stDegree / stDegreep
  10. Loop Until Abs(jd1 - jd0) < 0.0000001
  11. getjq_12a = jd1 + 8 / 24 - deltatT(yy) / 86400

  12. jd2 = jda
  13. W2 = k0 * pai * 2
  14. Do
  15.    jd0 = jd2
  16.    stDegree = moon_L(jd0) - earth_L(jd0) - W2
  17.    stDegreep = (moon_L(jd0 + 0.000005) - earth_L(jd0 + 0.000005) - moon_L(jd0 - 0.000005) + earth_L(jd0 - 0.000005)) / 0.00001
  18.    jd2 = jd0 - stDegree / stDegreep
  19. Loop Until Abs(jd2 - jd0) < 0.0000001
  20. getjq_12b = jd2 + 8 / 24 - deltatT(yy) / 86400

  21. If Round(getjq_12b, 0) = Round(jda, 0) Then
  22.    getjq_12 = getjq_12b
  23. ElseIf getjq_12b <= jda Then
  24.    getjq_12 = getjq_12b
  25. ElseIf getjq_12a <= jda Then
  26.    getjq_12 = getjq_12a
  27. ElseIf Round(getjq_12a, 0) = Round(jda, 0) Then
  28.    getjq_12 = getjq_12a
  29. End If

  30. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-18 16:59 | 显示全部楼层
cyfx2288 发表于 2019-2-17 23:50
各种网站,我都查过,农历网、台湾中央研究院的网页。各版本之间总的算来部分年度相关一两天,部分年度润 ...

甲子纪日 是不会错的,初一、十五的日期也 不会差太多(观月可得),不同朝代有差别的就是 定年首 和定 闰月。1楼 V2.0版本 已经修复了常见的bug,按第一个“无中气”定闰月 比较准确了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-18 17:08 | 显示全部楼层
YZC51 发表于 2019-2-16 22:47
古代万年历节选
明庄烈帝崇祯十五年·清太宗崇德七年壬午(公元1642年)

V2.0  生成农历(含闰11月)与之 一致。

777.JPG

TA的精华主题

TA的得分主题

发表于 2019-2-18 19:17 | 显示全部楼层
zopey 发表于 2019-2-18 17:08
V2.0  生成农历(含闰11月)与之 一致。

非常佩服楼主,农历函数做得精益求精!
2891 R10
3988 R12

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-18 21:07 | 显示全部楼层
YZC51 发表于 2019-2-18 19:17
非常佩服楼主,农历函数做得精益求精!
2891 R10
3988 R12

代入2891年, 某月初一日期 计算结果 2777302.495,四舍五入后为   2777302。
与网页计算的 2777303 有一天误差,使置闰结果不同。 这个原因未知,无法修改。

部分代码 可优化:

If jda >= getjq_12b Or Round(getjq_12b, 0) = Round(jda, 0) Then
   getjq_12 = getjq_12b
ElseIf jda >= getjq_12a Or Round(getjq_12a, 0) = Round(jda, 0) Then
   getjq_12 = getjq_12a
End If

TA的精华主题

TA的得分主题

发表于 2019-2-19 09:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 YZC51 于 2019-2-19 10:13 编辑

不会,瞎搞的
If yy = 2891 Then yzc = 21 / 4320
getjq_12 = getjq_12 + yzc

If yy = 3988 Or yy = 3989 Then yzc = 43 / 4320
getjq_24 = getjq_24 - yzc


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-19 09:45 | 显示全部楼层
农历的编算和颁行》国家标准:

(1)以北京时间为标准时间;
     北京时间属于协调世界时,协调世界时以原子时为基准,但通过闰秒的方式与世界时时刻的偏差不超过0.9秒,因此计算精度不计及编算时尚未正式发布的闰秒。

(2)朔日为农历月的第一个农历日;
     为了保证农历日期编排结果的唯一性,朔和节气时间的计算必须精确到在0时附近也能准确判断它们所在的农历日,在用于日期判定时对它们的计算精度要求应达到1秒。 (达不到这个精度

(3)包含节气冬至在内的农历月为农历十一月;

(4)若从某个农历十一月开始到下一个农历十一月(不含)之间有13个农历月,则需要置闰。置闰规则为:取其中最先出现的一个不包含中气的农历月为农历闰月。

(5)农历十一月之后第2个(不计闰月)农历月为农历年的起始月。

TA的精华主题

TA的得分主题

发表于 2019-2-19 10:18 | 显示全部楼层
本帖最后由 YZC51 于 2019-2-19 10:21 编辑
zopey 发表于 2019-2-19 09:45
农历的编算和颁行》国家标准:

(1)以北京时间为标准时间;

几千年到1万多年的时间跨度,精度很难达到1秒!
楼主能做到这样,就很不错啦!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-19 10:22 | 显示全部楼层
中国古代 也没有“北京时间“的 说法吧,各个地方时不同,那农历初一是怎么 精确定位的呢?

TA的精华主题

TA的得分主题

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

四柱预测更重视农历节气的安排!它是严格按照立春时间为新年开始的时间--进入寅月。然后是春夏秋冬四季轮回。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 03:15 , Processed in 0.041994 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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