解决问题

旧版农历获取方法报错,会有

到 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. Anaconda 用于科学计算的 Python 发行版

    用于科学计算的 Python 发行版: 1.Anaconda  https://www.continuum.io/    公司continuum.  有商业版本. Anaconda is the le ...

  2. 【Anaconda】:科学计算的Python发行版

    [背景] Python易用,但包管理和Python不同版本的问题比较头疼,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python,比如WinPython.Anaconda等, ...

  3. java 日历计算农历和节假日的工具类

    背景 业务需求需要后端提供这样的接口,网上找了很多java代码例子,虽然功能实现了 但是不完善,特别是节日那一块儿.然后百度发现有这样的插件,但是信息也是java后端提供的非js 然后在开源js插件找 ...

  4. IDEA 2021版新建Maven、TomCat工程

    目录 2021版IDEA中Maven.TomCat配置 1.基于Webapp创建一个Maven项目 1.1 新建项目模板 1.2 指定名称 1.3 指定信息 1.4 指定Maven地址 1.5 构建成 ...

  5. SQL Server 中计算农历

    1.建一表,放初始化资料   因为农历的日期,是由天文学家推算出来的,到现在只有到2049年的,以后的有了还可以加入!   CREATE TABLE SolarData ( yearId int no ...

  6. 在 Qualys SSL Labs SSL 测试中获得 A+ 评级的秘技 2021 版

    本系列文章将阐述主流应用交付控制器和主流 Web 服务器如何运行 HTTP/2 和 TLSv1.3 协议,以及如何在 SSL Test 中获得 A+ 评级. 请访问原文链接:https://sysin ...

  7. PAT 乙级 1063 计算谱半径(20) C++版

    1063. 计算谱半径(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 在数学中,矩阵的“谱半径”是指其特 ...

  8. OpenACC 计算圆周率(简单版)

    ▶ 书上的计算圆周率的简单程序,主要是使用了自定义函数 #include <stdio.h> #include <stdlib.h> #include <math.h&g ...

  9. 复利计算C转java版

    import java.util.Scanner; public class Compound_int { public static void main(String[] args) { tip() ...

随机推荐

  1. P2611-[ZJOI2012]小蓝的好友【Treap,扫描线】

    正题 题目链接:https://www.luogu.com.cn/problem/P2611 题目大意 \(r*c\)的网格上有\(n\)个标记点,然后求有多少个矩形包含至少一个标记点. \(1\le ...

  2. CentOS7 Docker容器无法ping通宿主机ip问题解决记录

    Docker服务部署启动容器发现docker容器内访问宿主机IP不通,于是进入容器内ping宿主机IP,发现无法ping通,容器IP为172.17.0.2,于是继续ping172.17.0.1也不通, ...

  3. VUE自学日志02-应用与组件实例

    准备好了吗? 我们刚才简单介绍了 Vue 核心最基本的功能--本教程的其余部分将更加详细地涵盖这些功能以及其它高阶功能,所以请务必读完整个教程! 应用 & 组件实例 创建一个应用实例创建一个应 ...

  4. 解决安装mysql 到start service出现未响应问题

    mysql下载地址 链接: https://pan.baidu.com/s/1vYpsNkVjUHqOKPQl9Y9A9A 提取码: wngn 安装可以参考 今天下载了MySql5.5,没想到的是前面 ...

  5. MySQL8.0.20下载与安装详细图文教程,mysql安装教程

    MySQL下载与安装(8.0.20版)教程 mysql安装包+mysql学习视频+mysql面试指南视频教程 下载地址: 链接:https://pan.baidu.com/s/1FmLFhGlajBQ ...

  6. ServletContext 学习

    ServletContext web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用: 1.共享数据 ​ 在这个Servlet中保存了数 ...

  7. [Java]Sevlet

    0 前言 对于Java程序员而言,Web服务器(如Tomcat)是后端开发绕不过去的坎.简单来看,浏览器发送HTTP请求给服务器,服务器处理后发送HTTP响应给浏览器. Web服务器负责对请求进行处理 ...

  8. kivy画板

    from kivy.app import App from kivy.graphics import Line, Color # 引入绘图线条,颜色 from kivy.uix.widget impo ...

  9. MarkDown之Typora使用

    Typora:所见即所得 常用快捷键 加粗:ctrl + B 标题:ctrl + 16,对于与16级标题 插入公式:ctrl + Shift + m 插入代码:ctrl + Shift + K 插入图 ...

  10. 力扣 - 剑指 Offer 57. 和为s的两个数字

    题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...