linux shell之天干地支算法-干支日计算

时间:2023-01-23 09:43:57


干支纪日从商朝便已开始,但其顺序到现在有无间断或错乱过,尚待考证。目前已确切知道的从春秋鲁隐公三年(公元前720年)二月己巳日起到清宣统三年(公元1911年)止(1912年民国元年采用公元纪年后,民间仍沿用)2600多年中从未间断和错乱过。 干支纪日法是商朝历法的最大成就,这是现今已知世界最长的纪日法,对于我国历史学,尤其是科学技术发展史的考证和研究,都是极为重要的记时标志,是我国一份珍贵的科学文化遗……


#这是我跟据网上资料用shell脚本语言写的一个输出现在的天干地支 日 的程序,如有不对的地方还请大家给于帮助。



#!/bin/bash

runnian=$(( $(date +%Y) % 4 ))


#判断今年是闰年还是平年,如果除尽就是闰年,否则就是平年。

case $runnian in


0)


a=$(( $(( $(( $(date +%y) + 100 )) / 4 )) % 10 ))


#计算闰年元旦天干数。2000年以后,结果对应下面的选项。。

b=$(( $(( $(( $(( $(date +%y) + 100 )) / 4 )) % 4 )) ))

##计算闰年元旦天干数。2000年以后,结果对应下面的选项。


#o=天干数  p=地支数

#计算当年当年元旦 地支

case $a in

1)

t="甲"

o=1

;;

2)

t="乙"

o=2

;;

3)

t="丙"

o=3

;;

4)

t="丁"

o=4

;;

5)

t="戊"

o=5

;;

6)

t="已"

o=6

;;

7)

t="庚"

o=7

;;

8)

t="辛"

o=8

;;

9)

t="壬"

o=9

;;

10)

t="癸"

o=10


esac

#计算闰年元旦地支数。2000年以后,结果对应下面的选项。元旦地支与天干不同,他只有这四个结果。

case $b in

1)

d="午"

p=7

;;

2)

d="卯"

p=4

;;

3)

d="子"

p=1

;;

0)

d="酉"

p=10

esac


runi=$(date +%m)


case $runi in

1 | 2 | 3 )

#如果月份是 1,2,3 参数为0

i=0

j=0

;;

*)

i=1

j=1

#如果是3月以后的月份,天干地支数各+1



y=$(date +%d)

h=$(date +%H)

case $h in

23)

li=1

;;

*)

li=0

esac



#gan=$(( $(( $o+$y+$i+$li )) % 10 ))

#zhi=$(( $(( $p+$y+$j+$li )) % 12 ))







;;

#如果是平年,则用下面的公试计算当年的元旦天干地支,

*)


c=$(( $(date +%Y) - $(( $(date +%Y) % 4 )) ))

#计算出本年是闰年后的第几年,后求出上一个闰年时间。


g=$(( $(date +%Y) % 4 ))

#判断今年是不是闰年


a=$(( $(( $(( $c + 100 )) / 4 )) % 10 ))

#求出上一个闰年的天干数


#计算闰年元旦天干数。2000年以后。


b=$(( $(( $(( $(( $c + 100 )) / 4 )) % 4 )) ))

#求出上一个闰年的地支数


#o=天干数  p=地支数

#计算当年当年元旦 地支在哪个选项里。

case $a in

1)

#如果上一个闰年天干是   “甲” ,则做下面的判断。

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

#如果今年是闰年后的第一年 天干数 +6 天克

o=7

;;

2)

#如果是第二年,+1 天顺

o=2

;;

3)

#如果是第三年,+6 天克

o=7

esac


t="甲"


;;

2)

#如果闰年的天干是 乙

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

#如果是闰年后的第一年 +6

o=8

;;

2)

#第二年 +1

o=3

;;

3)

#第三年 +6

o=8

esac


t="乙"

;;

3)

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

#第一年 +6

o=9

;;

2)

#第二年 +1

o=4

;;

3)

#第三年 +6

o=9


esac


t="丙"



;;

4)

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

o=10

;;

2)

o=5

;;

3)

o=10

esac


t="丁"



;;

5)

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

o=1

;;

2)

o=6

;;

3)

o=1

esac


t="戊"




;;

6)

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

o=2

;;

2)

o=7

;;

3)

o=2

esac


t="已"




;;

7)

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

o=3

;;

2)

o=8

;;

3)

o=3

esac


t="庚"




;;

8)

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

o=4

;;

2)

o=9

;;

3)

o=4

esac


t="辛"



;;

9)

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

o=5

;;

2)

o=10

;;

3)

o=5

esac


t="壬"




;;

10)

nianshut=$(( $(date +%Y) % 4 ))

case $nianshut in

1)

o=6

;;

2)

o=1

;;

3)

o=6

esac


t="癸"




esac

#下面开始计算地支


case $b in

1)

#如果上一年的地支是  午(7)

nians=$(( $(date +%Y) % 4 ))

case $nians in

1)

#第一年 +6 地冲 7+6)%12=1

p=1

;;

2)

#第二年 -1 地逆 7-1)%12=6

p=6

;;

3)

#第三年 +4  地库 7+4)%12=11

p=11

esac

;;

2)

#如果上个闰年的地支是 卯(4)计算方法同上

nians=$(( $(date +%Y) % 4 ))

case $nians in

1)

p=5

;;

2)

p=3

;;

3)

p=8

esac

;;

3)

#如果上个闰年的地支是  子(1)

nians=$(( $(date +%Y) % 4 ))

case $nians in

1)

p=7

;;

2)

p=12

;;

3)

p=5

esac

;;


0)

#如果上年闰年的地支是 酉(10)

nians=$(( $(date +%Y) % 4 ))

case $nians in

1)

p=4

;;

2)

p=9

;;

3)

p=2

esac

esac





#计算地支 下面是每个月要加减的参数。



yue=$(date +%m)

if [[ "$yue" -eq 1 ]]

then

i=-1

j=-1

elif [[ "$yue" -eq 2 ]]

then

i=0

j-6

elif [[ "$yue" -eq 3 ]]

then

i=-2

j=10

elif [[ "$yue" -eq 4 ]]

then

i=-1

j=5

elif [[ "$yue" -eq 5 ]]

then

i=-1

j=-1

elif [[ "$yue" -eq 6 ]]

then

i=0

j=6

elif [[ "$yue" -eq 7 ]]

then

i=0

j=0

elif [[ "$yue" -eq 8 ]]

then

i=1

j=7

elif [[ "$yue" -eq 9 ]]

then

i=2

j=2

elif [[ "$yue" -eq 10 ]]

then

i=2

j=8

elif [[ "$yue" -eq 11 ]]

then

i=3

j=3

else

i=3

j=9

fi



y=$(date +%d)

h=$(date +%H)

case $h in

23)

li=1

;;

*)

li=0

esac

#如果现在的时间是23时,那么在计算天数时要多加一天,因为干支里第天的开始是从子时也就是23时开始。



esac

#case 大架构到这里结束。


#$o是当年元旦的干数 $p是当年元旦的支数 $y是当月的日数  $i,$j是当月的加减参数。

gan=$(( $(( $o+$y+$i+$li )) % 10 ))

zhi=$(( $(( $p+$y+$j+$li )) % 12 ))



case $gan in

#计算天干数,如果在下面的选项里,则是当天的天干。

1)

ca="甲"

;;

2)

ca="乙"

;;

3)

ca="丙"

;;

4)

ca="丁"

;;

5)

ca="戊"

;;

6)

ca="已"

;;

7)

ca="庚"

;;

8)

ca="辛"

;;

9)

ca="壬"

;;

0)

ca="癸"

esac


#计算当天的地支

case $zhi in

#如果在下面的选项里则是当天的地支数

1)

da="子"

;;

2)

da="丑"

;;

3)

da="寅"

;;

4)

da="卯"

;;

5)

da="辰"

;;

6)

da="巳"

;;

7)

da="午"

;;

8)

da="末"

;;

9)

da="申"

;;

10)

da="酉"

;;

11)

da="戌"

;;

0)

da="亥"

esac


echo "$ca$da日"

#输出当天的天干地支


本文出自 “星河码头” 博客,请务必保留此出处http://liy607.blog.51cto.com/2892862/1343278