C#的万年历实现

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

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/contentalg/93725.html

数据结构说明

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

  2. 节气数据表(SolarTerm)

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

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

扩展功能建议

  1. 节日显示 添加节日判断逻辑(参考的节日数据表)
  2. 时辰计算 增加时辰(子时、丑时等)计算功能
  3. 农历节日 实现春节、中秋节等传统节日的日期计算
  4. 农历节气详细说明 添加每个节气的物候特征和文化习俗说明
相关文章
|
7月前
|
机器学习/深度学习 编解码 运维
MATLAB高阶谱分析工具箱(HOSA)解析
MATLAB高阶谱分析工具箱(HOSA)解析
|
8月前
|
网络安全 开发工具 git
配置本地环境以管理Git多账户SSH连接的方法
通过以上步駟设置后, 您可以轻松管理多個 Git 账户并且根据不同项目需求切换 SSH 密匙进行版本控制操作。
941 20
|
7月前
|
编解码 算法 数据可视化
基于MATLAB实现海浪数据处理与谱分析
基于MATLAB实现海浪数据处理与谱分析
|
8月前
|
数据格式
表面肌电信号(sEMG)完整处理流程 MATLAB
表面肌电信号(sEMG)完整处理流程 MATLAB
|
消息中间件 存储 XML
Kettle实现rabbitMQ的生产与消费
文章目录 一、Kettle为什么可以读取流数据? 二、rabbitMQ中启动MQTT插件并创建队列和路由键 三、Kettle实现rabbitMQ的生产与消费 Kettle是一款非常强大的ETL工具,不仅可以使用图形化界面,还可以处理各种数据,今天记录一下本人使用Kettle中MQTT组件来实现从rabbitMQ中读取流数据,并进行解析和处理。 提示:以下是本篇文章正文内容,下面案例可供参考
|
域名解析 Linux Shell
CentOS 7 执行 yum 命令失败问题的排查方法
本文主要为大家讲解CentOS 7系统中执行yum命令失败等常见问题的排查方法。
5470 0
CentOS 7 执行 yum 命令失败问题的排查方法
|
4月前
|
存储 算法 C#
C# 哈希值计算:MD5/SHA256 加密
本示例展示了C#中使用MD5和SHA256算法生成哈希值的方法,适用于密码加密与数据校验。MD5安全性较低,建议仅用于非敏感场景;密码存储推荐使用SHA256配合盐值以增强安全性。
|
8月前
|
数据采集 NoSQL 数据可视化
用Playwright打造可靠的企业级采集方案--从单机验证到集群化落地
本项目将单机Playwright爬虫逐步演进为分布式集群,解决脚本不稳定、限速、维护难等问题。以招聘数据采集为例,实现从页面解析、代理IP轮换、Redis任务队列到多机并发的完整链路,结合MongoDB/Elasticsearch落库与可视化,形成可复用的生产级爬虫架构,适用于数据分析、岗位监控等场景。
527 0
用Playwright打造可靠的企业级采集方案--从单机验证到集群化落地
|
4月前
|
存储 数据采集 机器学习/深度学习
基于MATLAB的协同过滤推荐算法实现
基于MATLAB的协同过滤推荐算法实现,包含用户-用户和物品-物品两种主流方法