编一个自己的万年历

前阶段突然想查一下某一天是星期几,于是自己编了一个[小程序][https://blog.csdn.net/weixin_41905135/article/details/138972055?spm=1001.2014.3001.5501],但是功能很单一,就是单纯的查是星期几。(虽然用网络工具或者手机的日历软件也很容易),但是自己编一个是不是更方便呢?当然是了。今天是AI的时代,想编程序已经很容易了。今天我把之前那个程序彻底重新捋了一次,增加了一些符合自己要求的功能。

系统环境

操作系统:macOS sonoma

IDE开发环境:PyCharm 2024.1专业版

Python 3.12

功能如下

将任意公历日期转换成农历日期、全年第几周的星期几、农历的属相年等

源代码如下:

from lunardate import LunarDate
from datetime import datetime
# 定义一个阴历类
class Lunar:
    # 类属性
    number_dict = {
        '0': '零',
        '1': '一',
        '2': '二',
        '3': '三',
        '4': '四',
        '5': '五',
        '6': '六',
        '7': '七',
        '8': '八',
        '9': '九',
        '10': '十',
        '11': '十一',
        '12': '十二'
    }
    # 类属性属相年
    animal_years = {
        0: "猴",
        1: "鸡",
        2: "狗",
        3: "猪",
        4: "鼠",
        5: "牛",
        6: "虎",
        7: "兔",
        8: "龙",
        9: "蛇",
        10: "马",
        11: "羊"
    }

    # 定义初始化函数
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
        self.date = datetime(year, month, day)
        self.date_str = self.date.strftime("%Y-%m-%d")
        self.lunar_date = None


    def get_weekday(self):
        """
        Convert date to weekday (Monday=0, Tuesday=1, ..., Sunday=6)
        """
        # 确定是第几周
        return (self.date.isocalendar().week), (self.date.weekday() + 1) % 7

    def convert_to_lunar_date(self):
        self.lunar_date = LunarDate.fromSolarDate(self.year, self.month, self.day)
        return self.lunar_date

    # day转成汉字函数
    def num_convert_char(self):
        if self.lunar_date.day // 10 == 0:
            day_char = '初' + self.number_dict[str(self.lunar_date.day % 10)]
        elif self.lunar_date.day == 10:
            day_char = '初十'
        elif self.lunar_date.day // 10 == 1 and self.lunar_date.day != 10:
            day_char = '十' + self.number_dict[str(self.lunar_date.day % 10)]
        elif self.lunar_date.day // 10 == 2:
            day_char = '廿' + self.number_dict[str(self.lunar_date.day % 10)]
        elif self.lunar_date.day // 10 == 3:
            day_char = '三十'
        return day_char

    # 数字转成汉字
    def lunar_char_year_month_day(self):
        # 汉字字符年
        chinese_year = ''
        for digit in str(self.lunar_date.year):
            chinese_year += self.number_dict[digit]
        if self.number_dict[str(self.lunar_date.month)] == '一':
            lunar_month = '正'
        else:
            lunar_month = self.number_dict[str(self.lunar_date.month)]
        return chinese_year, lunar_month, self.num_convert_char()

    # 定义一个获取属相年的函数
    def get_animal_year(self):
        return self.animal_years[self.lunar_date.year % 12]


if __name__ == '__main__':
    # 输入公历日期
    year = int(input("请输入年份:"))
    month = int(input("请输入月份:"))
    day = int(input("请输入日份:"))

    
    try:
     		 # 生成一个阳历日期对象
        solar_day = Lunar(year, month, day)
        weeknum, weekday = solar_day.get_weekday()
        # 转换为农历日期
        lunar_date = solar_day.convert_to_lunar_date()
        print('- ' * 30)
        print(f"阳历日期 : {solar_day.date:%Y/%m/%d}", end='\t')
        print(f"第{weeknum}周的{['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天'][weekday - 1]}")
        lunar_year, lunar_month, lunar_day = solar_day.lunar_char_year_month_day()
        if lunar_month == '十二':
            if lunar_day == '三十':
                print(f"阴历日期(农历): {lunar_year}年除夕(腊月三十)")
            else:
                print(f"阴历日期(农历): {lunar_year}年腊月{lunar_day}")
        else:
            print(f"阴历日期(农历): {lunar_year}年{lunar_month}月{lunar_day}")
        print(f'中国农历 : {solar_day.get_animal_year()}年')
        print('- '* 30)
    except ValueError as e:
        print(e)

代码说明:

该代码是一个 Python 类,用于将公历日期转换为农历日期并显示农历相关信息。它使用了 LunarDate 类来计算农历日期,并提供了 lunar_char_year_month_day() 方法来将农历日期转换为汉字。

使用方法:

  1. 输入公历日期(年份、月份、日份)。
  2. 代码将计算农历日期并打印以下信息:
    • 公历日期。
    • 公历日期的星期。
    • 农历日期。
    • 农历年的属相动物。

示例:

请输入年份:2024
请输入月份:05
请输入日份:24

阳历日期 : 2024/05/24	第21周的星期五
阴历日期(农历): 二零二四年四月十七
中国农历 : 龙年

Screenshot 2024-05-24 at 17.31.51

代码中使用的类和方法:

  • Lunar 类:用于表示公历日期。
  • LunarDate 类:用于表示农历日期。
  • num_convert_char() 方法:将农历日期的日部分转换为汉字。
  • lunar_char_year_month_day() 方法:将农历日期转换为汉字。
  • get_animal_year() 方法:根据农历年份返回属相动物。

部分代码借鉴AI(自行搭建的AI大模型Ollama)。