星期、干支、二十八宿计算公式

1. 求星期公式
星期=[5+A(实际天数)] mod 7

2. 干支计算公式
六十甲子干支序号,从1->59->0。
六十甲子干支序号=[23+A(实际天数)] mod 60

3. 二十八宿计算公式
二十八宿序号=[23+A(实际天数)] mod 28

4. 实际天数A的计算
A=B(基本天数)+C(闰日天数)
B=(计算年-1)*365+(要计算到年的月日天数)
例:1984年2月1日的基本天数B=(1984-1)*365+(31+1)=723827(天),
其中,31是1月为31天,1为2月1日为1天。
公元308年8月28日的基本天数
B=(308-1)*365+(31+28+31+30+31+30+31+27)=112055+239=112294(天)
这里的(要计算到年的月日天数),用的是公历,月日天数的规则我好
象小学就学过了。哈哈……

C=(计算年-1) div 4 -误差修正值 + fixValue2
fixValue2为0或者1。常值为0,当年数为闰年(公历闰年法)之中的3月
1日之后的为1。

误差修正值推算:
公元元年1月1日至1582年10月14日为0。
1582年10月15日至1699年12月31日为10。
从1701年1月1日起每增加一个世纪累加1,但能被400除尽的世纪不累
加1。此方法推算即可。
--有一个问题,1700年这一年的修正值应为多少呢?算法中正好没有
讲到,但看来应该是10。

例1701年1月1日起误差值为11,而1801年1月1日起误差修正值为12,
而1901年1月1日起误差修正值为13,
但2001年误差修正值仍为13,因为2000年能被400整除,故不累加。而
2101年1月1日起误差修正值为14。

5. 实例:1998.3.15的星期、干支与二十八宿
B=(1998-1)*365+(31+28+15)=728979
C=(1998-1) div 4 - 13 + 0 = 486
A=B+C=728979+486=729465
星期序号=(5+729465) mod 7=0,即为星期日
干支序号=(13+729465) mod 60=58,即为辛酉
二十八宿序号=(23+729465) mod 28=4,即为房

1. 干支记年

1  2   3   4  5   6  7   8  9  10
   甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉
    11  12 13   14  15  16  17  18  19  20
   甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛己 壬午 癸未
    21  22  23  24  25  26  27  28  29  30
   甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳

    31  32  33  34  35  36  37  38  39  40
   甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯
    41  42  43  44  45  46  47  48  49  50
   甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑

    51  52  53  54  55  56  57  58  59  60
   甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥

公元后:年份(y)计算方式 :((y%60)-4+60)%60

公元前: 年份(y)计算方式: (57-y%60+60)%60

2.干支记月

年 份 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月
甲、巳 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 甲戌 乙亥 丙子 丁丑
乙、庚 戊寅 己卯 庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑
丙、辛 庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑
丁、壬 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑
戊、癸 甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥 甲子 乙丑

注:干支与阳历一样都是以地球公转周期计算的,阴历最好转为阳历再计算,干支的月份是以二十四节气为起始,和阴历阳历的月份都没有直接关系

3.干支记日

G = 4C + [C / 4] + 5y + [y / 4] + [3 * (M + 1) / 5] + d - 3
Z = 8C + [C / 4] + 5y + [y / 4] + [3 * (M + 1) / 5] + d + 7 + i

  其中 C 是世纪数减一,y 是年份后两位,M 是月份,d 是日数。1月和2月按上一年的13月和14月来算。奇数月i=0,偶数月i=6。G 除以10的余数是天干,Z 除以12的余数是地支。
  计算时带[ ]的数表示取整。

你可能感兴趣的:(C++,c,算法,C#)