干支纪年与公元纪年互换

常见的公元纪年转干支纪年计算方法,是建立在已知天干表和地支表而不知六十甲子表的基础上求算的

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. 不存在公元元年,公元前与公元后需要区分处理

猜你喜欢

转载自blog.csdn.net/weixin_42763614/article/details/81256461