C# 计算农历日期方法(2021版)
解决问题
旧版农历获取方法报错,会有
到 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版)的更多相关文章
- Anaconda 用于科学计算的 Python 发行版
用于科学计算的 Python 发行版: 1.Anaconda https://www.continuum.io/ 公司continuum. 有商业版本. Anaconda is the le ...
- 【Anaconda】:科学计算的Python发行版
[背景] Python易用,但包管理和Python不同版本的问题比较头疼,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python,比如WinPython.Anaconda等, ...
- java 日历计算农历和节假日的工具类
背景 业务需求需要后端提供这样的接口,网上找了很多java代码例子,虽然功能实现了 但是不完善,特别是节日那一块儿.然后百度发现有这样的插件,但是信息也是java后端提供的非js 然后在开源js插件找 ...
- IDEA 2021版新建Maven、TomCat工程
目录 2021版IDEA中Maven.TomCat配置 1.基于Webapp创建一个Maven项目 1.1 新建项目模板 1.2 指定名称 1.3 指定信息 1.4 指定Maven地址 1.5 构建成 ...
- SQL Server 中计算农历
1.建一表,放初始化资料 因为农历的日期,是由天文学家推算出来的,到现在只有到2049年的,以后的有了还可以加入! CREATE TABLE SolarData ( yearId int no ...
- 在 Qualys SSL Labs SSL 测试中获得 A+ 评级的秘技 2021 版
本系列文章将阐述主流应用交付控制器和主流 Web 服务器如何运行 HTTP/2 和 TLSv1.3 协议,以及如何在 SSL Test 中获得 A+ 评级. 请访问原文链接:https://sysin ...
- PAT 乙级 1063 计算谱半径(20) C++版
1063. 计算谱半径(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 在数学中,矩阵的“谱半径”是指其特 ...
- OpenACC 计算圆周率(简单版)
▶ 书上的计算圆周率的简单程序,主要是使用了自定义函数 #include <stdio.h> #include <stdlib.h> #include <math.h&g ...
- 复利计算C转java版
import java.util.Scanner; public class Compound_int { public static void main(String[] args) { tip() ...
随机推荐
- MySQL的本地事务、全局事务、分布式事务
本地事务 事务特性:ACID,其中C一致性是目的,AID是手段. 实现隔离性 写锁:数据加了写锁,其他事务不能写也不能读. 读锁:数据加了读锁,其他事务不能加写锁可以加读锁,可以允许自己升级为写锁. ...
- Node.js Koa框架学习笔记
Koa 基本介绍 Koa是Node.js中非常出名的一款WEB框架,其特点是短小精悍性能强. 它由Express原版人马打造,同时也是Egg框架的设计蓝图,可以说Koa框架的学习性价比是非常高的. 官 ...
- 使用CEF(一)— 起步
使用CEF(一)- 起步 介绍 Chromium Embedded Framework (CEF)是个基于Google Chromium项目的开源Web browser控件,支持Windows, Li ...
- js 判断两个对象是否相等
最近碰到的一个面试题,不算高频,记录一下 判断两个对象是否相等,大致分为三步 首先判断两个比较对象是不是 Object 如果都是对象 再比较 对象的长度是否相等 如果两个对象的长度相等 再比较对象属性 ...
- 『基于ArcGIS的Python编程秘籍(第2版)』书本源码
ArcPy学习 第1章 面向ArcGIS的Python编程语言的基础 略 第2章 管理地图文档和图层 引用当前的地图文档 引用磁盘上的地图文档 获取地图文档的图层列表 限制图层列表 缩放至所选要素 改 ...
- Java初步学习——2021.10.05每日总结,第五周周二
(1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了二维数组,包括二维数组的声明,和二维数组的创建.以及获取二维数组的长度,其中要注意的是二维数组是每个元素都是一维数 ...
- 洛谷4172 WC2006水管局长(LCT维护最小生成树)
这个题和魔法森林感觉有很相近的地方啊 同样也是维护一个类似最大边权最小的生成树 但是不同的是,这个题是有\(cut\)和询问,两种操作.... 这可如何是好啊? 我们不妨倒着来考虑,假设所有要\(cu ...
- 随机生成文章的AI(C++)
#include <iostream> #include <cstdlib> #include <ctime> #include <fstream> u ...
- NC105 二分查找法
二分查找(一) 二分查找看似简单,但是有很多的细节要注意. 题目是牛客NC105,找到有序数组中第一个大于或者等于所查找的数字. 初步写了如下的代码: class Solution { public: ...
- 初学Python-day12 装饰器函数
装饰器 1.概念 本质就是一个Python函数,其他函数在本身不变的情况下去增加额外的功能,装饰器的返回值是一个函数. 常用的场景:插入日志,事务处理,缓存,权限校验等. 2.普通函数回顾 1 def ...