干支纪日从商朝便已开始,但其顺序到现在有无间断或错乱过,尚待考证。目前已确切知道的从春秋鲁隐公三年(公元前720年)二月己巳日起到清宣统三年(公元1911年)止(1912年民国元年采用公元纪年后,民间仍沿用)2600多年中从未间断和错乱过。 干支纪日法是商朝历法的最大成就,这是现今已知世界最长的纪日法,对于我国历史学,尤其是科学技术发展史的考证和研究,都是极为重要的记时标志,是我国一份珍贵的科学文化遗……
#这是我跟据网上资料用shell脚本语言写的一个输出现在的天干地支 年和月 的程序,如有不对的地方还请大家给于帮助
#!/bin/bash
gan=$(($(date +%y)%10))
#计算天干数的公式
zhi=$(($(date +%Y)%12))
计算地支数的公式
z=$(date +%m%d)
#计算月日的公式
yue=$(date +%m)
ri=$(date +%d)
lichunri=$(( $(( $(( $(( $(date +%y) * 2422 ))+38700 )) / 10000 )) - $(( $(( $(date +%y) - 1 )) / 4 )) ))
#天干地支里,每个干支年的开始是从立春开始,所以确定立春时间是判断这一年是哪个干支的重要依据,
#$(( (( $(( $(( $(date +%y) * 2422 ))+38700 )) / 10000 )) - $(( $(( $(date +%y) - 1 )) / 4 )) ))
case $gan in
#这是计算当年天干的算法,如果当日的时间是立春以后,则天干 为c ,反之为 c-1
# 甲 乙 丙 丁 戊 己 庚 辛 壬 癸
# 4 5 6 7 8 9 10 1 2 3
4)
if [ "$z" -gt 020$lichunri ]
then
c="甲"
else
c="癸"
fi
;;
5)
if [ "$z" -gt 020$lichunri ]
then
c="乙"
else
c="甲"
fi
;;
6)
if [ "$z" -gt 020$lichunri ]
then
c="丙"
else
c="乙"
fi
;;
7)
if [ "$z" -gt 020$lichunri ]
then
c="丁"
else
c="丙"
fi
;;
8)
if [ "$z" -gt 020$lichunri ]
then
c="戊"
else
c="丁"
fi
;;
9)
if [ "$z" -gt 020$lichunri ]
then
c="已"
else
c="戊"
fi
;;
0)
if [ "$z" -gt 020$lichunri ]
then
c="庚"
else
c="已"
fi
;;
1)
if [ "$z" -gt 020$lichunri ]
then
c="辛"
else
c="庚"
fi
;;
2)
if [ "$z" -gt 020$lichunri ]
then
c="壬"
else
c="辛"
fi
;;
3)
if [ "$z" -gt 020$lichunri ]
then
c="癸"
else
c="壬"
fi
esac
#计算当年地支,如果当天日期在立春以后 地支为 d ,反之为 d-1
# 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥
# 4 5 6 7 8 9 10 11 12 1 2 3
case $zhi in
4)
if [ "$z" -gt 020$lichunri ]
then
d="子"
else
d="亥"
fi
;;
5)
if [ "$z" -gt 020$lichunri ]
then
d="丑"
else
d="子"
fi
;;
6)
if [ "$z" -gt 020$lichunri ]
then
d="寅"
else
d="丑"
fi
;;
7)
if [ "$z" -gt 020$lichunri ]
then
d="卯"
else
d="寅"
fi
;;
8)
if [ "$z" -gt 020$lichunri ]
then
d="辰"
else
d="卯"
fi
;;
9)
if [ "$z" -gt 020$lichunri ]
then
d="巳"
else
d="辰"
fi
;;
10)
if [ "$z" -gt 020$lichunri ]
then
d="午"
else
d="巳"
fi
;;
11)
if [ "$z" -gt 020$lichunri ]
then
d="未"
else
d="午"
fi
;;
0)
if [ "$z" -gt 020$lichunri ]
then
d="申"
else
d="未"
fi
;;
1)
if [ "$z" -gt 020$lichunri ]
then
d="酉"
else
d="申"
fi
;;
2)
if [ "$z" -gt 020$lichunri ]
then
d="戌"
else
d="酉"
fi
;;
3)
if [ "$z" -gt 020$lichunri ]
then
d="亥"
else
d="戌"
fi
esac
echo "$c$d年"
#输出当前的天干地支
#如果当前的天干地支为以下选项,则对应当年的 五行 和 生肖(这块也可以用数字代替汉字 “甲子”等)
case $c$d in
甲子)
f="金"
g="鼠"
;;
乙丑)
f="金"
g="牛"
;;
丙寅)
f="火"
g="虎"
;;
丁卯)
f="火"
g="免"
;;
戊辰)
f="木"
g="龙"
;;
已巳)
f="木"
g="蛇"
;;
庚午)
f="土"
g="马"
;;
辛未)
f="土"
g="羊"
;;
壬申)
f="金"
g="猴"
;;
癸酉)
f="金"
g="鸡"
;;
甲戌)
f="火"
g="狗"
;;
乙亥)
f="火"
g="猪"
;;
丙子)
f="水"
g="鼠"
;;
丁丑)
f="水"
g="牛"
;;
戊寅)
f="土"
g="虎"
;;
已卯)
f="土"
g="免"
;;
庚辰)
f="金"
g="龙"
;;
辛巳)
f="金"
g="蛇"
;;
壬午)
f="木"
g="马"
;;
癸未)
f="木"
g="羊"
;;
甲申)
f="水"
g="猴"
;;
乙酉)
f="水"
g="鸡"
;;
丙戌)
f="土"
g="狗"
;;
丁亥)
f="土"
g="猪"
;;
戊子)
f="火"
g="鼠"
;;
己丑)
f="火"
g="牛"
;;
庚寅)
f="木"
g="虎"
;;
辛卯)
f="木"
g="免"
;;
壬辰)
f="水"
g="龙"
;;
癸巳)
f="水"
g="蛇"
;;
甲午)
f="金"
g="马"
;;
乙未)
f="金"
g="羊"
;;
丙申)
f="火"
g="猴"
;;
丁酉)
f="火"
g="鸡"
;;
戊戌)
f="木"
g="狗"
;;
已亥)
f="木"
g="猪"
;;
庚子)
f="土"
g="鼠"
;;
辛丑)
f="土"
g="牛"
;;
壬寅)
f="金"
g="虎"
;;
癸卯)
f="金"
g="免"
;;
甲辰)
f="火"
g="龙"
;;
乙巳)
f="火"
g="蛇"
;;
丙午)
f="水"
g="马"
;;
丁未)
f="水"
g="羊"
;;
戊申)
f="土"
g="猴"
;;
已酉)
f="土"
g="鸡"
;;
庚戌)
f="金"
g="狗"
;;
辛亥)
f="金"
g="猪"
;;
壬子)
f="木"
g="鼠"
;;
癸丑)
f="木"
g="牛"
;;
甲寅)
f="水"
g="虎"
;;
乙卯)
f="水"
g="免"
;;
丙辰)
f="土"
g="龙"
;;
丁巳)
f="土"
g="蛇"
;;
戊午)
f="火"
g="马"
;;
已未)
f="火"
g="羊"
;;
庚申)
f="木"
g="猴"
;;
辛酉)
f="木"
g="鸡"
;;
壬戌)
f="水"
g="狗"
;;
癸亥)
f="水"
g="猪"
esac
echo "$f命"
echo "属$g"
#输出当前的 五行 和生肖
#下面是计算月干支历,因每个干支月的交替是按24节气循环的,这里没有给出精确的24节气时间,所以在计算月干支时,如果在节气交替前后一天可能会不确。
# 1/5 ; 2/4 ; 3/6 ; 4/5; 5/6; 6/6 ; 7/7 ; 8/8 ; 9/8 ; 10/8 ; 11/7 ;12/7
#下面是计算月干支历
case $c in
#如果当前的天干在下面的选项里,则跟据节气交替日来判断这个月的干支。
甲 | 已 )
#如果现在的年天干 为 甲 或 乙。 则跟据节气交替日来判断这个月的干支
case $yue in
2)
#2月
if [ $ri -gt 4 ]
then
e="丙寅"
else
e="乙丑"
fi
;;
3)
#3月
if [ $ri -gt 6 ]
then
e="丁卯"
else
e="丙寅"
fi
;;
4)
#4月
if [ $ri -gt 5 ]
then
e="戊辰"
else
e="丁卯"
fi
;;
5)
#5月
if [ $ri -gt 6 ]
then
e="已巳"
else
e="戊辰"
fi
;;
6)
#6月
if [ $ri -gt 6 ]
then
e="庚午"
else
e="已巳"
fi
;;
7)
#7月
if [ $ri -gt 7 ]
then
e="辛未"
else
e="庚午"
fi
;;
8)
#8月
if [ $ri -gt 8 ]
then
e="壬申"
else
e="辛未"
fi
;;
9)
#9月
if [ $ri -gt 8 ]
then
e="癸酉"
else
e="壬申"
fi
;;
10)
#10月
if [ $ri -gt 8 ]
then
e="甲戌"
else
e="癸酉"
fi
;;
11)
#11月
if [ $ri -gt 7 ]
then
e="乙亥"
else
e="甲戌"
fi
;;
12)
#12月
if [ $ri -gt 7 ]
then
e="丙子"
else
e="乙亥"
fi
;;
1)
#1月
if [ $ri -gt 6 ]
then
e="丁丑"
else
e="丙子"
fi
esac
;;
乙 | 庚 )
#如果现在的年天干 为 乙或庚。 则跟据节气交替日来判断这个月的干支
case $yue in
2)
if [ $ri -gt 4 ]
then
e="戊寅"
else
e="丁丑"
fi
;;
3)
if [ $ri -gt 6 ]
then
e="已卯"
else
e="戊寅"
fi
;;
4)
if [ $ri -gt 5 ]
then
e="庚辰"
else
e="已卯"
fi
;;
5)
if [ $ri -gt 6 ]
then
e="辛巳"
else
e="庚辰"
fi
;;
6)
if [ $ri -gt 6 ]
then
e="壬午"
else
e="辛巳"
fi
;;
7)
if [ $ri -gt 7 ]
then
e="癸未"
else
e="壬午"
fi
;;
8)
if [ $ri -gt 8 ]
then
e="甲申"
else
e="癸未"
fi
;;
9)
if [ $ri -gt 8 ]
then
e="乙酉"
else
e="甲申"
fi
;;
10)
if [ $ri -gt 8 ]
then
e="丙戌"
else
e="乙酉"
fi
;;
11)
if [ $ri -gt 7 ]
then
e="丁亥"
else
e="丙戌"
fi
;;
12)
if [ $ri -gt 7 ]
then
e="戊子"
else
e="丁亥"
fi
;;
1)
if [ $ri -gt 6 ]
then
e="已丑"
else
e="戊子"
fi
esac
;;
丙 | 辛 )
#如果现在的年天干 为 丙或辛。 则跟据节气交替日来判断这个月的干支
case $yue in
2)
if [ $ri -gt 4 ]
then
e="庚寅"
else
e="已丑"
fi
;;
3)
if [ $ri -gt 6 ]
then
e="辛卯"
else
e="庚寅"
fi
;;
4)
if [ $ri -gt 5 ]
then
e="壬辰"
else
e="辛卯"
fi
;;
5)
if [ $ri -gt 6 ]
then
e="癸巳"
else
e="壬辰"
fi
;;
6)
if [ $ri -gt 6 ]
then
e="甲午"
else
e="癸巳"
fi
;;
7)
if [ $ri -gt 7 ]
then
e="乙未"
else
e="甲午"
fi
;;
8)
if [ $ri -gt 8 ]
then
e="丙申"
else
e="乙未"
fi
;;
9)
if [ $ri -gt 8 ]
then
e="丁酉"
else
e="丙申"
fi
;;
10)
if [ $ri -gt 8 ]
then
e="戊戌"
else
e="丁酉"
fi
;;
11)
if [ $ri -gt 7 ]
then
e="已亥"
else
e="戊戌"
fi
;;
12)
if [ $ri -gt 7 ]
then
e="庚子"
else
e="已亥"
fi
;;
1)
if [ $ri -gt 6 ]
then
e="辛丑"
else
e="庚子"
fi
esac
;;
丁 | 壬 )
#如果现在的年天干 为 丁或壬。 则跟据节气交替日来判断这个月的干支
case $yue in
2)
if [ $ri -gt 4 ]
then
e="壬寅"
else
e="辛丑"
fi
;;
3)
if [ $ri -gt 6 ]
then
e="癸卯"
else
e="壬寅"
fi
;;
4)
if [ $ri -gt 5 ]
then
e="甲辰"
else
e="癸卯"
fi
;;
5)
if [ $ri -gt 6 ]
then
e="乙巳"
else
e="甲辰"
fi
;;
6)
if [ $ri -gt 6 ]
then
e="丙午"
else
e="乙巳"
fi
;;
7)
if [ $ri -gt 7 ]
then
e="丁未"
else
e="丙午"
fi
;;
8)
if [ $ri -gt 8 ]
then
e="戊申"
else
e="丁未"
fi
;;
9)
if [ $ri -gt 8 ]
then
e="已酉"
else
e="戊申"
fi
;;
10)
if [ $ri -gt 8 ]
then
e="庚戌"
else
e="已酉"
fi
;;
11)
if [ $ri -gt 7 ]
then
e="辛亥"
else
e="庚戌"
fi
;;
12)
if [ $ri -gt 7 ]
then
e="壬子"
else
e="辛亥"
fi
;;
1)
if [ $ri -gt 6 ]
then
e="癸丑"
else
e="壬子"
fi
esac
;;
戊 | 癸 )
#如果现在的年天干 为 戊或癸。 则跟据节气交替日来判断这个月的干支
case $yue in
2)
if [ $ri -gt 4 ]
then
e="甲寅"
else
e="癸丑"
fi
;;
3)
if [ $ri -gt 6 ]
then
e="乙卯"
else
e="甲寅"
fi
;;
4)
if [ $ri -gt 5 ]
then
e="丙辰"
else
e="乙卯"
fi
;;
5)
if [ $ri -gt 6 ]
then
e="丁巳"
else
e="丙辰"
fi
;;
6)
if [ $ri -gt 6 ]
then
e="戊午"
else
e="丁巳"
fi
;;
7)
if [ $ri -gt 7 ]
then
e="已未"
else
e="戊午"
fi
;;
8)
if [ $ri -gt 8 ]
then
e="庚申"
else
e="已未"
fi
;;
9)
if [ $ri -gt 8 ]
then
e="辛酉"
else
e="庚申"
fi
;;
10)
if [ $ri -gt 8 ]
then
e="壬戌"
else
e="辛酉"
fi
;;
11)
if [ $ri -gt 7 ]
then
e="癸亥"
else
e="壬戌"
fi
;;
12)
if [ $ri -gt 7 ]
then
e="甲子"
else
e="癸亥"
fi
;;
1)
if [ $ri -gt 6 ]
then
e="乙丑"
else
e="甲子"
fi
esac
esac
echo "$e月"
#输出当前干支月
sh /tmp/jr
sh /tmp/js