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()}");
}
}
}
关键功能实现说明
-
农历计算
- 基于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); // ... 完整算法参考 } -
节气计算
- 基于太阳黄经的节气计算(参考)
private string GetSolarTerm() { int termIndex = CalculateSolarTermIndex(_date); return SolarTerm[termIndex]; } -
干支纪年
- 天干地支循环计算(参考)
private string GetGanZhiYear() { int ganIndex = (_date.Year - 4) % 10; int zhiIndex = (_date.Year - 4) % 12; return GanZhi[ganIndex] + Zhi[zhiIndex]; } -
星座判断
- 月份和日期组合判断(参考)
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
数据结构说明
-
农历数据表(LunarDateArray) 存储1900-2049年每月的农历信息,包含: 月份大小(1为大月30天,0为小月29天) 闰月信息(第4-1位表示闰月月份)
-
节气数据表(SolarTerm)
存储24节气名称,按顺序排列:
private static readonly string[] SolarTerm = { "小寒", "大寒", "立春", "雨水", ..., "冬至" };
扩展功能建议
- 节日显示 添加节日判断逻辑(参考的节日数据表)
- 时辰计算 增加时辰(子时、丑时等)计算功能
- 农历节日 实现春节、中秋节等传统节日的日期计算
- 农历节气详细说明 添加每个节气的物候特征和文化习俗说明
浙公网安备 33010602011771号