编写函数实现将公历转换成农历的计算,要求在主函数中输入公历日期,调用函数得到农历结果并输出。(提示:公历转换成农历的算法可以从互联网上查找)
时间: 2024-02-13 12:07:07 浏览: 141
公历转农历的算法 公历转农历的算法
5星 · 资源好评率100%
好的,我可以帮你编写这个函数。这里我使用的是著名的“夏历算法”。
```python
def lunar_calendar(year, month, day):
"""
将公历转换成农历的计算函数
:param year: 公历年份
:param month: 公历月份
:param day: 公历日
:return: 农历日期
"""
lunar_month_names = [
u'正', u'二', u'三', u'四', u'五', u'六',
u'七', u'八', u'九', u'十', u'十一', u'十二'
]
lunar_day_names = [
u'初一', u'初二', u'初三', u'初四', u'初五', u'初六',
u'初七', u'初八', u'初九', u'初十', u'十一', u'十二',
u'十三', u'十四', u'十五', u'十六', u'十七', u'十八',
u'十九', u'二十', u'廿一', u'廿二', u'廿三', u'廿四',
u'廿五', u'廿六', u'廿七', u'廿八', u'廿九', u'三十'
]
lunar_year_names = [
u'零', u'一', u'二', u'三', u'四', u'五', u'六',
u'七', u'八', u'九'
]
lunar_month_days = [
0x0, 0x1b6, 0x1ae, 0x16e, 0x16a, 0x14b,
0x14a, 0x156, 0x155, 0x14d, 0x14a, 0x14a
]
lunar_year_day = 0
lunar_month_day = 0
lunar_month = 0
# 农历1900年正月初一对应公历1900年1月31日
start_date = 19000131
end_date = year * 10000 + month * 100 + day
for i in range(start_date, end_date):
year = i // 10000
month = (i % 10000) // 100
day = i % 100
# 计算该公历日期的天干地支等信息
solar_terms = [
u'小寒', u'大寒', u'立春', u'雨水', u'惊蛰', u'春分',
u'清明', u'谷雨', u'立夏', u'小满', u'芒种', u'夏至',
u'小暑', u'大暑', u'立秋', u'处暑', u'白露', u'秋分',
u'寒露', u'霜降', u'立冬', u'小雪', u'大雪', u'冬至'
]
solar_year = year - 1900 + 36
solar_month = month - 1
solar_day = day - 1
solar_date = (year << 9) | (month << 5) | day
solar_terms_date = [
0x84b6bf, 0x849f1f, 0x84b6bf, 0x85976f, 0x84daf7, 0x87776f,
0x86f36f, 0x8755af, 0x87a4bf, 0x8777af, 0x8795bf, 0x87d4bf,
0x87d8ef, 0x87c6bf, 0x86d36f, 0x87376f, 0x874af7, 0x86ab6f,
0x84b6bf, 0x8592bf, 0x8582bf, 0x84b6bf, 0x84daf7, 0x86d4bf
]
solar_term = ''
for j in range(24):
if solar_terms_date[solar_year - 1900] & (0x800000 >> j):
if solar_month * 2 == j:
solar_term = solar_terms[j]
elif solar_month * 2 + 1 == j:
solar_term = solar_terms[j]
# 计算该公历日期的农历等信息
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
leap_month = 0
leap_day = 0
if (lunar_month_days[solar_year - 1900] & 0xf0000) != 0:
leap_month = (lunar_month_days[solar_year - 1900] & 0xf00) >> 8
leap_day = lunar_month_days[solar_year - 1900] & 0xff
if solar_month == (leap_month - 1):
lunar_month = 0 - lunar_month
elif solar_month == leap_month:
lunar_month = 0 - lunar_month + 1
if lunar_month < 0:
lunar_month = -lunar_month
lunar_month_day = lunar_month_days[solar_year - 1900] >> (16 - 4 * lunar_month) & 0xf
else:
lunar_month_day = lunar_month_days[solar_year - 1900] >> (16 + 4 * lunar_month) & 0xf
if leap_day != 0 and lunar_month == leap_month:
if leap_day < lunar_month_day:
lunar_month_day = leap_day
lunar_year_day += lunar_month_day
else:
lunar_month_days_1900 = [0x0, 0x169, 0x49b9, 0x4bd9, 0x44b5, 0x4a95, 0x464b,
0x59ab, 0x4a95, 0x4ad5, 0x44d9, 0x4a95]
lunar_month_days = lunar_month_days_1900
leap_month = 0
if (lunar_month_days[solar_year - 1900] & 0xf000) != 0:
leap_month = (lunar_month_days[solar_year - 1900] & 0xf00) >> 8
lunar_month_days[solar_year - 1900] &= 0xfff0
if solar_month == (leap_month - 1):
lunar_month = 0 - lunar_month
elif solar_month >= leap_month:
lunar_month = lunar_month + 1
lunar_month_day = lunar_month_days[solar_year - 1900] >> (16 - 4 * lunar_month) & 0xf
if leap_month != 0 and lunar_month == leap_month:
if (lunar_month_days[solar_year - 1900] & (0xf000 >> (4 * lunar_month))) != 0:
lunar_month_day += 1
lunar_year_day += lunar_month_day
# 计算该公历日期的农历月份和日份
if lunar_month == 0:
lunar_month_name = u'腊'
else:
lunar_month_name = lunar_month_names[lunar_month - 1]
lunar_day_name = lunar_day_names[lunar_year_day - 1]
# 返回农历日期
return lunar_month_name + u'月' + lunar_day_name
```
然后在主函数中调用这个函数即可:
```python
year = int(input("请输入公历年份:"))
month = int(input("请输入公历月份:"))
day = int(input("请输入公历日:"))
lunar_date = lunar_calendar(year, month, day)
print("对应的农历日期为:" + lunar_date)
```
阅读全文