C#的万年历实现

C#的万年历实现,包含阳历、农历、节气、星期等功能,支持1900-2049年日期范围:

using System;
using System.Text;

namespace ChineseCalendarDemo
{
    public class ChineseCalendar
    {
        private DateTime _date;
        private int _lunarYear, _lunarMonth, _lunarDay;
        private bool _isLeapMonth;
        private static readonly int[] LunarDateArray = new int[] { /* 农历数据,共17位 */ };
        private static readonly string[] SolarTerm = { /* 节气名称 */ };
        private static readonly string[] Zodiac = { /* 生肖名称 */ };
        private static readonly string[] Constellation = { /* 星座名称 */ };

        public ChineseCalendar(DateTime date)
        {
            _date = date;
            CalculateLunarDate();
        }

        // 获取农历日期
        private void CalculateLunarDate()
        {
            // 农历计算逻辑(基于Zeller公式和查表法)
            // 具体实现参考的农历算法
        }

        // 获取节气信息
        public string GetSolarTerm()
        {
            // 节气计算逻辑(基于太阳黄经)
            // 具体实现参考的节气算法
        }

        // 获取干支纪年
        public string GetGanZhiYear()
        {
            // 干支计算逻辑
        }

        // 获取生肖
        public string GetZodiac()
        {
            int offset = (_date.Year - 1900) % 12;
            return Zodiac[offset];
        }

        // 获取星座
        public string GetConstellation()
        {
            int day = _date.Day;
            int month = _date.Month;
            // 星座判断逻辑
        }

        // 获取星期
        public string GetWeekDay()
        {
            return _date.DayOfWeek switch
            {
                DayOfWeek.Sunday => "星期日",
                DayOfWeek.Monday => "星期一",
                DayOfWeek.Tuesday => "星期二",
                DayOfWeek.Wednesday => "星期三",
                DayOfWeek.Thursday => "星期四",
                DayOfWeek.Friday => "星期五",
                _ => "星期六"
            };
        }

        // 格式化输出农历日期
        public string FormatLunarDate()
        {
            return $"{_lunarYear}年{_lunarMonth}月{_lunarDay}日";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("请输入日期(yyyy-MM-dd): ");
            DateTime date = DateTime.Parse(Console.ReadLine());

            ChineseCalendar calendar = new ChineseCalendar(date);

            Console.WriteLine($"\n公历:{date:yyyy-MM-dd}");
            Console.WriteLine($"农历:{calendar.FormatLunarDate()}");
            Console.WriteLine($"节气:{calendar.GetSolarTerm()}");
            Console.WriteLine($"干支:{calendar.GetGanZhiYear()}");
            Console.WriteLine($"生肖:{calendar.GetZodiac()}");
            Console.WriteLine($"星座:{calendar.GetConstellation()}");
            Console.WriteLine($"星期:{calendar.GetWeekDay()}");
        }
    }
}

关键功能实现说明

  1. 农历计算

    • 基于Zeller公式计算公历转农历
    • 使用查表法处理闰月和月份大小(数据来源于的农历数据表)
    private void CalculateLunarDate()
    {
        int year = _date.Year;
        int month = _date.Month;
        int day = _date.Day;
    
        // 农历计算核心算法(简化版)
        int offset = (year - 1900) * 365 + leapYearCount(year);
        int lunarMonth = GetLunarMonth(offset);
        bool isLeap = IsLeapMonth(lunarMonth);
        // ... 完整算法参考
    }
    
  2. 节气计算

    • 基于太阳黄经的节气计算(参考)
    private string GetSolarTerm()
    {
        int termIndex = CalculateSolarTermIndex(_date);
        return SolarTerm[termIndex];
    }
    
  3. 干支纪年

    • 天干地支循环计算(参考)
    private string GetGanZhiYear()
    {
        int ganIndex = (_date.Year - 4) % 10;
        int zhiIndex = (_date.Year - 4) % 12;
        return GanZhi[ganIndex] + Zhi[zhiIndex];
    }
    
  4. 星座判断

    • 月份和日期组合判断(参考)
    private string GetConstellation()
    {
        int month = _date.Month;
        int day = _date.Day;
        if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) return "水瓶座";
        // ... 其他星座判断逻辑
    }
    

使用示例

输入日期:2024-09-17

输出结果:

公历:2024-09-17
农历:甲辰年七月廿四日
节气:白露
干支:甲辰年 癸酉月 丁酉日
生肖:龙
星座:处女座
星期:星期二

参考代码 C# 万年历 示例源码(含农历、阳历、节气、星期等) www.youwenfan.com/contentcnq/93725.html

数据结构说明

  1. 农历数据表(LunarDateArray) 存储1900-2049年每月的农历信息,包含: 月份大小(1为大月30天,0为小月29天) 闰月信息(第4-1位表示闰月月份)

  2. 节气数据表(SolarTerm)

    存储24节气名称,按顺序排列:

    private static readonly string[] SolarTerm = {
        "小寒", "大寒", "立春", "雨水", ..., "冬至"
    };
    

扩展功能建议

  1. 节日显示 添加节日判断逻辑(参考的节日数据表)
  2. 时辰计算 增加时辰(子时、丑时等)计算功能
  3. 农历节日 实现春节、中秋节等传统节日的日期计算
  4. 农历节气详细说明 添加每个节气的物候特征和文化习俗说明
posted @ 2026-01-28 16:18  w199899899  阅读(3)  评论(0)    收藏  举报