解决问题

旧版农历获取方法报错,会有
到 2021年 m数组越界了 if (LunarData[m] < 4095)
此方法可以解决

主体代码

public static class ChinaDate
{private static ChineseLunisolarCalendar china = new ChineseLunisolarCalendar();private static Hashtable gHoliday = new Hashtable();private static Hashtable nHoliday = new Hashtable();private static string[] JQ = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };private static int[] JQData = { 0, 21208, 43467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758 };static ChinaDate(){//公历节日gHoliday.Add("0101", "元旦");gHoliday.Add("0214", "情人节");gHoliday.Add("0305", "雷锋日");gHoliday.Add("0308", "妇女节");gHoliday.Add("0312", "植树节");gHoliday.Add("0315", "消费者权益日");gHoliday.Add("0401", "愚人节");gHoliday.Add("0501", "劳动节");gHoliday.Add("0504", "青年节");gHoliday.Add("0601", "儿童节");gHoliday.Add("0701", "建党节");gHoliday.Add("0801", "建军节");gHoliday.Add("0910", "教师节");gHoliday.Add("1001", "国庆节");gHoliday.Add("1224", "平安夜");gHoliday.Add("1225", "圣诞节");//农历节日nHoliday.Add("0101", "春节");nHoliday.Add("0115", "元宵节");nHoliday.Add("0505", "端午节");nHoliday.Add("0815", "中秋节");nHoliday.Add("0909", "重阳节");nHoliday.Add("1208", "腊八节");}/// <summary>/// 获取农历/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetChinaDate(DateTime dt){if (dt > china.MaxSupportedDateTime || dt < china.MinSupportedDateTime){//日期范围:1901 年 2 月 19 日 - 2101 年 1 月 28 日throw new Exception(string.Format("日期超出范围!必须在{0}到{1}之间!", china.MinSupportedDateTime.ToString("yyyy-MM-dd"), china.MaxSupportedDateTime.ToString("yyyy-MM-dd")));}string str = string.Format("{0} {1}{2}", GetYear(dt), GetMonth(dt), GetDay(dt));string strJQ = GetSolarTerm(dt);if (strJQ != ""){str += " (" + strJQ + ")";}string strHoliday = GetHoliday(dt);if (strHoliday != ""){str += " " + strHoliday;}string strChinaHoliday = GetChinaHoliday(dt);if (strChinaHoliday != ""){str += " " + strChinaHoliday;}return str;}/// <summary>/// 获取农历年份/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetYear(DateTime dt){int yearIndex = china.GetSexagenaryYear(dt);string yearTG = " 甲乙丙丁戊己庚辛壬癸";string yearDZ = " 子丑寅卯辰巳午未申酉戌亥";string yearSX = " 鼠牛虎兔龙蛇马羊猴鸡狗猪";int year = china.GetYear(dt);int yTG = china.GetCelestialStem(yearIndex);int yDZ = china.GetTerrestrialBranch(yearIndex);string str = string.Format("[{1}]{2}{3}{0}", year, yearSX[yDZ], yearTG[yTG], yearDZ[yDZ]);return str;}/// <summary>/// 获取农历月份/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetMonth(DateTime dt){int year = china.GetYear(dt);int iMonth = china.GetMonth(dt);int leapMonth = china.GetLeapMonth(year);bool isLeapMonth = iMonth == leapMonth;if (leapMonth != 0 && iMonth >= leapMonth){iMonth--;}string szText = "正二三四五六七八九十";string strMonth = isLeapMonth ? "闰" : "";if (iMonth <= 10){strMonth += szText.Substring(iMonth - 1, 1);}else if (iMonth == 11){strMonth += "十一";}else{strMonth += "腊";}return strMonth + "月";}/// <summary>/// 获取农历日期/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetDay(DateTime dt){int iDay = china.GetDayOfMonth(dt);string szText1 = "初十廿三";string szText2 = "一二三四五六七八九十";string strDay;if (iDay == 20){strDay = "二十";}else if (iDay == 30){strDay = "三十";}else{strDay = szText1.Substring((iDay - 1) / 10, 1);strDay = strDay + szText2.Substring((iDay - 1) % 10, 1);}return strDay;}/// <summary>/// 获取节气/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetSolarTerm(DateTime dt){DateTime dtBase = new DateTime(1900, 1, 6, 2, 5, 0);DateTime dtNew;double num;int y;string strReturn = "";y = dt.Year;for (int i = 1; i <= 24; i++){num = 525948.76 * (y - 1900) + JQData[i - 1];dtNew = dtBase.AddMinutes(num);if (dtNew.DayOfYear == dt.DayOfYear){strReturn = JQ[i - 1];}}return strReturn;}/// <summary>/// 获取公历节日/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetHoliday(DateTime dt){string strReturn = "";object g = gHoliday[dt.Month.ToString("00") + dt.Day.ToString("00")];if (g != null){strReturn = g.ToString();}return strReturn;}/// <summary>/// 获取农历节日/// </summary>/// <param name="dt"></param>/// <returns></returns>public static string GetChinaHoliday(DateTime dt){string strReturn = "";int year = china.GetYear(dt);int iMonth = china.GetMonth(dt);int leapMonth = china.GetLeapMonth(year);int iDay = china.GetDayOfMonth(dt);if (china.GetDayOfYear(dt) == china.GetDaysInYear(year)){strReturn = "除夕";}else if (leapMonth != iMonth){if (leapMonth != 0 && iMonth >= leapMonth){iMonth--;}object n = nHoliday[iMonth.ToString("00") + iDay.ToString("00")];if (n != null){if (strReturn == ""){strReturn = n.ToString();}else{strReturn += " " + n.ToString();}}}return strReturn;}
}

调用方法:

ChinaDate.GetChinaDate(DateTime dt) //获取农历日期ChinaDate.GetYear(DateTime dt) //获取农历年份(包含天干地支和生肖信息)ChinaDate.GetMonth(DateTime dt) //获取农历月份ChinaDate.GetDay(DateTime dt) //获取农历日期ChinaDate.GetSolarTerm(DateTime dt) //获取节气ChinaDate.GetHoliday(DateTime dt) //获取公历节日

C# 计算农历日期方法(2021版)相关推荐

  1. GM/T 0005《随机性检测规范》2012版和2021版对比

    目录 1. 背景 2. 规范的差异性对比 2.1 检测项存在的差异 2.1.1 检测线差异的概况 2.1.3 累加和检测的差异 2.1.4 游程分布检测的差异 2.1.5 离散傅里叶检测的差异 2.1 ...

  2. 最新发布!《阿里云实时计算 Flink 版解决方案白皮书-2021版》开放下载

    简介:阿里云实时计算 Flink 版解决方案白皮书-2021版正式发布- Apache Flink:全球领先的开源大数据计算引擎 Apache Flink 是一个开源的分布式大数据处理引擎,可对有限数 ...

  3. 全球及中国有色金属行业产量规模与未来发展形势展望报告2021版

    全球及中国有色金属行业产量规模与未来发展形势展望报告2021版 HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS-- [修订日期]:2021年11月 [搜索 ...

  4. [渝粤教育] 西南科技大学 高频电子线路 在线考试复习资料2021版

    高频电子线路--在线考试复习资料2021版 一.单选题 1.直接调频电路的优点是(    ). A.载频稳定度高 B.能够获得较大的线性频偏 答案:看左边查询 2.调频信号,则调频指数(最大相偏)是( ...

  5. [渝粤教育] 西南科技大学 国际贸易理论与实务 在线考试复习资料2021版(2)

    国际贸易理论与实务--在线考试复习资料2021版 一.单选题 1.根据货币数量理论,国内货币供给增加50%将导致(    )  A.国内价格水平提高50% B.国内价格水平提高幅度大于50% C.国内 ...

  6. [渝粤教育] 西南科技大学 计算机网络应用基础 在线考试复习资料2021版(1)

    计算机网络应用基础--在线考试复习资料2021版 一.单选题 1. 在数字通信中广泛采用CRC循环冗余码的原因是CRC可以(  ). A. 检测出一位差错 B. 检测并纠正一位差错     C. 检测 ...

  7. [渝粤教育] 西南科技大学 机电一体化技术 在线考试复习资料2021版

    机电一体化技术--在线考试复习资料2021版 一.单选题 1.随着计算机图形显示技术的发展,出现了人机对话式自动编程(又称交互式),该技术以(    )为其基础. A.图形显示技术 B.数字处理技术 ...

  8. PCL(Point Cloud Library)学习指南资料推荐(2021版)

    PCL(Point Cloud Library)学习指南&资料推荐(2021版) 版权 双愚 https://zhuanlan.zhihu.com/p/268524083?utm_source ...

  9. 【OWASP Top 10】2021版

    [OWASP Top 10]2021版 A01:失效的访问控制(Broken Access Control) 失效的访问控制(Broken Access Control)从第五位上升到了第一位.94% ...

  10. 2021年安全员-B证(广西省-2021版)考试题库及安全员-B证(广西省-2021版)考试内容

    题库来源:安全生产模拟考试一点通公众号小程序 安全员-B证(广西省-2021版)考试题库考前必练!安全生产模拟考试一点通每个月更新安全员-B证(广西省-2021版)考试内容题目及答案!多做几遍,其实通 ...

最新文章

  1. 金融数据分析(二)-------基本资本,金融衍生品,资本收益率
  2. Fisheye camera
  3. C# SortedDictionary以及SortedList的浅谈
  4. mysql读写分离和组复制_数据库主从复制,读写分离,负载均衡,分库分表分别表达的什么概念?...
  5. Linux中的通配符
  6. 结合hello world探讨gcc编译程序的过程
  7. IntelliJ IDEA使用教程(很全)
  8. ASP.NET MVC3 系列教程 - 如何使项目Debug进MVC3源代码
  9. 解读畅捷通微服务治理能力提升之路
  10. C++学习(二六七)find_package() find_library()
  11. keil4软件的下载与安装
  12. 车辆路径问题(VRP)初探
  13. web开源FlowPlayer视频播放器
  14. Linux 安装python 3.8(Linux 的版本为 Centos 7)
  15. 使用树莓派搭建家用 NAS
  16. 开机就是linux图形界面,怎么进入控制台,输命令? shell
  17. spring简单教程
  18. 第18节--python文件读写
  19. oracle财务云案例,Oracle ERP云助力财务团队提升业务弹性
  20. html怎么去除广告,无需外力 巧妙去除Vagaa哇嘎界面广告

热门文章

  1. 2021-09-10 网安实验-文件修复-各种文件的文件头
  2. Ubuntu12.04 64位 无法运行32位程序 吉林大学校园网客户端Drcom DrClient
  3. 电脑连接校园网不自动跳转到登录界面
  4. php十六进制加1,二进制110000转化为十六进制
  5. java pdf查看_Java检查PDF文件是否损坏
  6. java摇号抽奖程序_HTML5教程之年终摇号抽奖小程序
  7. PLC通过PIO模式控制绝对位置型IAI电缸
  8. Python常用模块库
  9. 东芝打印机共享怎么设置_理光打印机共享怎么设置?
  10. AVI视频文件编码格式不受支持0xc00d5212怎么解决?