天干地支的推算(根据公元纪年的年月日推算干支的年月日)

为了便于运算和使检索更加直观,借用六十干支表并按顺序加以编号成表一如下:
六十干支表 
甲子0 乙丑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 
该表于公元前后的推算均适用,具体的方法如下:
1,求公元后某年(设为Y)的干支。方法是:先以Y除以60得出余数,然后再减去4,最后根据所得结果查表一中相应序数所对应的干支即为该年的干支。
例如求公元1911年的干支:1911÷60余数为51,减4后得47,查表一47对应的干支是辛亥,即1911年为辛亥年。由于干支纪年60年一循环,当Y÷60的余数小于4时,需借干支纪年的一个周期60之数,例如1981年除以60余数为1,直接减4不够减,加上60之后再减4等于57,查表一便知1981年为辛酉年。余可类推。
2,求公元前某年(设为X)的干支。方法是:先以X除以60求其余数,再用57减去所得余数,根据所得结果再查表一中对应的干支,即为该年的干支。
例如求公元前221年的干支:221÷60,余数是41,以57-41=16,查表一16对应的是庚辰,即公元前221年对应的干支应为庚辰。同样由于干支纪年的循环周期为60年,当余数大于57时,也需再借60。例如求公元前479年(孔子卒年)的干支:479除以60余59,用57减59不够减,加上60之后再减59等于58,查表一知该年对应的干支为壬戌。其余可以类推。

如果要推算月:
其方法为:若遇甲或己的年份 ,正月是丙寅;遇上乙或庚之年,正月为戊寅;遇上丙或辛之年,正月为庚寅;遇上丁或壬之年,正月为壬寅;遇上戊或癸之年,正月为甲寅。依照正月之干支,其余月份按干支推算即可。

如果推算日:
从已知日期计算干支纪日的公式为: 
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的余数是地支。
计算时带[ ]的数表示取整。
例如:查2006年4月1日的干支日。 将数值代入计算公式。
G =4*20 + [20 / 4] + 5*06 + [06 / 4] + [3 * (4 + 1) / 5] + 1 - 3 =197 
除以10 余数为 7 ,天干的第7位是‘庚’。 
Z =8*20 + [20 / 4] + 5*06 + [06 / 4] + [3 * (4 + 1) / 5] + 1 + 7 + 6 =213
除以12 余数为 9 ,地支的第9位是‘申’。
答案是:2006年4月1日的干支日是庚申日。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
有关期函数 //1.生肖(年份参数:int ls_year 返回参数:string): mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(ls_year -1900,12)+13)*2 -1,2) //2.天干地支(年份参数:int ls_year 返回参数:string): mid(fill('甲乙丙丁戊己庚辛壬癸',40),(mod(ls_year -1924,10)+11)*2 -1,2)+mid(fill('子丑寅卯辰巳午未申酉戌亥',48),(mod(ls_year -1924,12)+13)*2 -1,2) //3.星座(期参数:date ls_date 返回参数:string): mid("摩羯水瓶双鱼白羊金牛双子巨蟹狮子处女天秤天蝎射手摩羯",(month(ls_date)+sign(sign(day(ls_date) -(19+integer(mid('102123444423',month(ls_date),1))))+1))*4 -3,4)+'座' //4.判断闰年(年份参数:int ls_year 返回参数:int 0=平年,1=闰年): abs(sign(mod(sign(mod(abs(ls_year),4))+sign(mod(abs(ls_year),100))+sign(mod(abs(ls_year),400)),2)) -1) //5.某月天数(期参数:date ls_date 返回参数:int): integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ls_date)),4))+sign(mod(abs(year(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'3232332323',month(ls_date),1))) //6.某月最后一天期(期参数:date ls_date 返回参数:date): date(year(ls_date),month(ls_date),integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ls_date)),4))+sign(mod(abs(year(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'3232332323',month(ls_date),1)))) //7.另一个求某月最后一天期(期参数:date ls_date 返回参数:date): a. RelativeDate (date(year(ls_date)+sign(month(ls_date) -12)+1,mod(month(ls_date)+1,13)+abs(sign(mod(month(ls_date)+1,13)) -1),1),-1) b. RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),-1) //8.另一个求某月天数(期参数:date ls_date 返回参数:int): a. day(RelativeDate (date(year(ls_date)+sign(month(ls_date) -12)+1,mod(month(ls_date)+1,13)+abs(sign(mod(month(ls_date)+1,13)) -1),1),-1)) b. day(RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),-1)) //9.某月某星期几--同PB系统函数DayName(期参数:date ls_date 返回参数:string): '星期'+mid('一二三四五六',(mod(year(ls_date) -1 + int((year(ls_date) -1)/4) - int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + daysafter(date(year(ls_date),1,1),ls_date)+1,7)+1)*2 -1,2) //10.求相隔若干月份后的相对期(期参数:date ls_date 相隔月份(可取负数):int ls_add_month 返回参数:date): da

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值