C#中将日期转换农历方法

在做一些数据统计或者时间方面的开发时,通常会遇到需要对时间的农历与阴历之间相互进行转化,需要查询当前日期是否为春节或其他节日,判断是否为春节期间“jrDate == "除夕" || jrDate == "春节" || jrSDate.Day < 7 && jrMonth == "正月"”,可以使用此工具类。

DateTime nDate = Convert.ToDateTime(date); //当前需要转换的日期

string jrDate = ChinaDate.GetChinaHoliday(nDate); //获取农历节日

string jrMonth = ChinaDate.GetMonth(nDate); //获取农历月份

string jrDay = ChinaDate.GetDay(nDate); //获取农历日期

DateTime jrSDate = ChinaDate.GetSunYearDate(nDate); //阳历转阳历

DateTime jrLDate = ChinaDate.GetLunarYearDate(jrSDate.AddYears(-1)); //阴历转阳历

///

/// 农历与阴历之间相互转化工具类

///

publicclassChinaDate

{

#region农历信息获取

private static ChineseLunisolarCalendar china=newChineseLunisolarCalendar();

privates tatic 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};

staticChinaDate()

{

//公历节日

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","腊八节");

}

///

/// 获取农历

///

public static string GetChinaDate(DateTimedt)

{

if(dt>china.MaxSupportedDateTime||dt

{

//日期范围: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")));

}

stringstr=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;

}

returnstr;

}

///

/// 获取农历年份

///

///

///

public static string GetYear(DateTimedt)

{

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;

}

///

/// 获取农历月份

///

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+"月";

}

///

/// 获取农历日期

///

///

///

public static stringGetDay(DateTimedt)

{

inti Day=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);

}

returnstrDay;

}

///

/// 获取节气

///

///

///

public static string GetSolarTerm(DateTimedt)

{

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;

}

///

/// 获取公历节日

///

///

///

public static string GetHoliday(DateTimedt)

{

string strReturn="";

object g=gHoliday[dt.Month.ToString("00")+dt.Day.ToString("00")];

if(g!=null)

{

strReturn=g.ToString();

}

return strReturn;

}

///

/// 获取农历节日

///

///

///

public static string GetChinaHoliday(DateTimedt)

{

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;

}

#endregion

#region阴历-阳历-转换

///

/// 阴历转为阳历

///

///指定的年份

public static DateTime GetLunarYearDate(DateTimedt)

{

int cnYear=china.GetYear(dt);

int cnMonth=china.GetMonth(dt);

int num1=0;

int num2=china.IsLeapYear(cnYear)?13:12;

while(num2>=cnMonth)

{

num1+=china.GetDaysInMonth(cnYear,num2--);

}

num1=num1-china.GetDayOfMonth(dt)+1;

return dt.AddDays(num1);

}

///

/// 阳历转为阴历

///

///公历日期

///农历的日期

public static DateTime GetSunYearDate(DateTimedt)

{

int year=china.GetYear(dt);

int iMonth=china.GetMonth(dt);

int iDay=china.GetDayOfMonth(dt);

int leapMonth=china.GetLeapMonth(year);

bool isLeapMonth=iMonth==leapMonth;

if(leapMonth!=0&&iMonth>=leapMonth)

{

iMonth--;

}

string str=string.Format("{0}-{1}-{2}",year,iMonth,iDay);

DateTime dtNew=DateTime.Now;

try

{

dtNew=Convert.ToDateTime(str);//防止出现2月份时,会出现超过时间,出现“2015-02-30”这种错误日期

}

catch

{

}

return dtNew;

}

#endregion

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,353评论 0 6
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,850评论 0 2
  • 日期转化一 为了达到不同的显示效果有时,我们需要对时间进行转化,默认格式为:2007-01-03 14:33:34...
    itrojan阅读 1,543评论 0 51
  • 一. Java基础部分.................................................
    wy_sure阅读 3,805评论 0 11