FileMaker中国论坛 | FileMaker学习,构筑,使用 | FileMaker商业开发|FileMaker中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 4534|回复: 0

FileMaker 农历 [复制链接]

Rank: 8Rank: 8

发表于 2013-1-29 09:06:35 |显示全部楼层
本帖最后由 dlamd 于 2013-1-29 09:11 编辑

前些天 开发兄 在群里发了一个 万年历的模板 于是有人问到农历的相关功能
突然想到自己对农历这个东西的规则什么的还不太了解
于是研究了下发现农历这东西是根据月亮的角度来的
....对古人无比崇拜

中国农历规则

中国农历是阴阳历,同时跟天文月和天文年同步。

农历月的天数是一个变数,有时是 29 天,有时是 30 天。

农历每月的第一天是月亮全黑的日子。

农历年由 24 个节气来确定,节气则由太阳的角度来确定。农历的第一个节气叫 雨水,定在太阳的角度为 330 度的日子。其余的 23 个节气分别定在太阳的角度 每变化 15 度的日子。下面的表格列出了 24 个节气的名称和定义:

命称 角度 公历日期 周期立春 315 2月 4日 雨水 330 2月19日 29.8天 惊蛰 345 3月 6日 春分 0 3月21日 30.2天 清明 15 4月 5日 谷雨 30 4月20日 30.7天 立夏 45 5月 6日 夏满 60 5月21日 31.2天 芒种 75 6月 6日 夏至 90 6月22日 31.4天 小暑 105 7月 7日 大暑 120 7月23日 31.4天 立秋 135 8月 8日 处暑 150 8月23日 31.1天 白露 165 9月 8日 秋分 180 9月23日 30.7天 寒露 195 10月 8日 霜降 210 10月24日 30.1天 立冬 225 11月 8日 小雪 240 11月22日 29.7天 大雪 255 12月 7日 冬至 270 12月22日 29.5天 小寒 285 1月 6日 大寒 300 1月20日 29.5天

24 个节气中有 12 个是主节气:雨水,春分,谷雨,夏满,夏至,大暑,处暑, 秋分,霜降,小雪,冬至,大寒。

农历年跟天文年相差较大。农历常年有十二个农历月,有 353,354,或者 355 天,比天文年少大约 11 天。为了跟天文年同步,每隔三个农历常年左右,必需设 一闰年。闰年有十三个月,添加的这个月叫闰月。

农历十二个月的名称分别为:正月,二月,三月,四月,五月,六月,七月,八 月,九月,十月,冬月,腊月。

农历闰年闰月的确定比较难,规则有两条:

  • 一:冬至必须落在农历冬月。如果落不上,腊月之前就要添上一个月,成为闰 年。
  • 二:如果是闰年,冬月后边第一个不含主节气的月份定为闰月。闰月使用前一 月份的名称。

农历年以 60 年为一周期,每年的名称由 10 个天干的一个字和 12 个地支的一 个字排列而成。10 天干为:甲,乙,丙,丁,戊,己,庚,辛,壬,癸。12 地支 为:子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥。12 地支有 12 动物生肖 与其对应:鼠,牛,虎,兔,龙,蛇,马,羊,猴,鸡,狗,猪。

跟据历史记载,农历年已经经过了 78 个周期。今年,公历 1999 年,是第 79 个周期的第 17 年,也就是农历第 4696 年。

总结起来,中国农历有下例 6 条规则:

  • 一:月全黑规则 - 月全黑的日子是农历月的第一天。农历月周期由此而定。
  • 二:24 节气规则 - 24 节气把天文年按太阳角度分成 24 等份,15 度一节气。 这个规则确定了农历和天文年的关系。
  • 三:冬至规则 - 冬至必须落在农历冬月。如果落不上,腊月之前就要添上一个 月,成为闰年。
  • 四:闰月规则 - 如果是闰年,冬月后边第一个不含主节气的月份定为闰月。
  • 五:60 年周期 - 农历年以 60 年为一周期。
  • 六:规则一和二的计算必须以中国南京紫金山天文台的观察为准。



竟然是根据月亮角度 固定的公式算法我觉得不太可能了..起码的有个对照表啥的是不
起码我是这么想的》。。
google 了下 还真有公式的算法 不过有年限限制
感觉不太靠谱...月亮角度你也能算?

又google下 找到了个150年的对照表 而且家人有说
阴历是要靠天文观测的,因此上面这些不确定的数据,是可以从天文台得到的
要推算阴历,就要根据这些数据来推,150个数据可推150年的阴历,因此目前最大只能推算到2049年,以后的推导,还需要从天文台得到新的数据后才能推导,否则将出现误差


嗯嗯 感觉靠谱很多

0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0


0x04bd8,代表阳历1900.1.31为始的阴历0年,是5个16进制数,共20bit



构思了下.....得到如下结论
竟然能知道每年的润月就能知道每年的天数
然后在用每年的天数相加 被减
就能的到同年的天数差
在对天数差进行处理 能就得到月份 和天数
嗯嗯
我唯一担心的就是速度问题...FM只能递归调用

开工

要是没记得错的话FM只能10进制
简单转换下 得到
"0|101101010100|0";
"0|110101101010|0";
"0|101011011010|2";
"0|100101011011|0";

如此格式.....

自定义yesarDays 函数 的到参数年的农历天数

这个...开始的函数名字用英文 每次都查字典...后期崩溃了 直接上中文了
英文差的孩子好苦逼.....
函数写到后来 都不知道那个是那个了.....
1.png


写了几个函数
最后根据本年相差的天数进行递归
唉...FM 不能循环呀...苦逼死我了
这个润月 我换了好几个方法...才实现
目前测试还没发现问题...
2.png


最后在再把这些碎的函数整合下
给它一个"参数"参数进行控制
3.png

参数空 全格式
1 生肖
2 年份
3 月份

4 日
4.png


最后在开发的模板测试了下

其实 这个是0.1版本...月份的算法有问题 后来改正了.
总来的说 速度还是有点慢....刚开的时候会小卡
之后就流畅起来..



归档.zip

103.37 KB, 下载次数: 30

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|FileMaker中国工作室

GMT+8, 2019-3-22 10:19 , Processed in 0.240378 second(s), 14 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部