常见的公元纪年转干支纪年计算方法,是建立在已知天干表和地支表而不知六十甲子表的基础上求算的
nian = input("请输入年份或干支(公元前输入负数):")
if nian == 0:
print("不存在公元0年\n公元元年干支为辛酉")
elif nian < 0:
n = -nian # 年的个位数
niangan = (8 - n % 10 - 1) % 10
nianzhi = (10 - n % 12 - 1) % 12
print(tiangan[niangan] + dizhi[nianzhi])
else:
niangan = (nian % 10 - 3 - 1) % 10
nianzhi = (nian % 12 - 3 - 1) % 12
print(tiangan[niangan] + dizhi[nianzhi])
对于计算机程序,已知天干和地支可以直接生成干支表,再通过索引查找
#干支纪年与公元纪年转换
#Python3.3
#已知公元元年为辛酉年,即公元4年为甲子年
tiangan = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
dizhi = ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
ganzhi =['']*60
for i in range(60):
ganzhi[i] = tiangan[i%10]+dizhi[(i)%12]
nian = input("请输入年份或干支(公元前输入负数):")
try:#判断输入值是否为整数
nian = int(nian)
flag = True
except:
flag = False
if flag == True: #已知年份求干支
nian = int(nian)
if nian == 0:
print("不存在公元0年\n公元元年干支为辛酉")
elif nian < 0:
print(ganzhi[(nian-3)%60])
else:
print(ganzhi[(nian-4)%60])
else: #已知干支求年份
try:
upper = eval(input("请输入年份上限,没有请按确认键:"))
except:
upper = 2500 #默认上限
try:
lower = eval(input("请输入年份下限,没有请按确认键:"))
except:
lower = -2500 #默认下限
no = ganzhi.index(nian) + 4
i = 0
year = upper
while year >= lower: # 找到最低年份
year = no
year = year - i * 60
i += 1
while year <= upper:
year = year + 60
if lower <= year <= upper:
if year < 0:
print(year-1)
else:
print(year)
干支表参考
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 癸亥
Notice:
1. isdigit()函数会判断每个字符是否为整数,因此无法判断负数
2. isinstance()无法判断字符串
3. 不存在公元元年,公元前与公元后需要区分处理