由.Net类库提供的农历计算(C#农历)
中国毕竟是一个文明大国,有一些自己悠久的历史文化传统,农历就是其中之一,它对指导农业生产有着极为重要的意义,还有春节等一些传节日并没有因为使用公元纪年而消失,在程序开发种我们也经常会遇到一些需要在公历与农历之间进行 转换,在1.1之前大家都是采用了第三方的算法(我也采用过),现在在.net2.0种已经提供了这种功能了。下面我就以几个简单的例子展示它的用法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | using System; using System.Collections.Generic; using System.Text; using System.Globalization; /** * 说明:在东亚各国,除了通用的公元纪年之外,还有各自以前使用的阴历纪年法,在.net2.0种增加了针对东亚各国的日历类EastAsianLunisolarCalendar, * 它是一个抽象类,有各种针对不同国家的的子类,其中ChineseLunisolarCalendar就是针对中国的日历类,它提公元纪年与中国传统农历纪年之间的相互转换 * 利用它可以计算天干地支等有关农历的信息,本程序就是来简单展示这个类的用法。它能计算的农历范围从公历1901-2-19至2101-1-28。 * 作者:周公 * 日期:2007-11-21 * 最后维护日期:2010-01-05 * 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2007/11/21/1896258.aspx */ namespace ChineseCalendar { public class Calendar { private static ChineseLunisolarCalendar chineseDate = new ChineseLunisolarCalendar(); static void Main( string [] args) { //ChineseLunisolarCalendar chineseDate = new ChineseLunisolarCalendar(); ShowYearInfo(); ShowCurrentYearInfo(); Console.ReadLine(); } /// <summary> /// 展示阴历年份信息 /// </summary> public static void ShowYearInfo() { for ( int i = chineseDate.MinSupportedDateTime.Year; i < chineseDate.MaxSupportedDateTime.Year; i++) { Console.WriteLine( "年份:{0},月份总数:{1},总天数:{2},干支序号:{3}" , i, chineseDate.GetMonthsInYear(i),chineseDate.GetDaysInYear(i) ,chineseDate.GetSexagenaryYear( new DateTime(i,3,1))); } } /// <summary> /// 展示当前年份信息 /// </summary> public static void ShowCurrentYearInfo() { int lYear=chineseDate.GetYear(DateTime.Now); int lMonth=chineseDate.GetMonth(DateTime.Now); int lDay=chineseDate.GetDayOfMonth(DateTime.Now); /** GetLeapMonth(int year)方法返回一个1到13之间的数字, * 比如:1、该年阴历2月有闰月,则返回3 * 如果:2、该年阴历8月有闰月,则返回9 * GetMonth(DateTime dateTime)返回是当前月份,忽略是否闰月 * 比如:1、该年阴历2月有闰月,2月返回2,闰2月返回3 * 如果:2、该年阴历8月有闰月,8月返回8,闰8月返回9 */ int leapMonth = chineseDate.GetLeapMonth(lYear); //获取第几个月是闰月,等于0表示本年无闰月 //如果今年有闰月 if (leapMonth > 0) { //闰月数等于当前月份 if (lMonth == leapMonth) { Console.WriteLine( "今年的阴历日期:{0}年闰{1}月{2}日。" , lYear, lMonth - 1, lDay); } else if (lMonth > leapMonth) // { Console.WriteLine( "今年的阴历日期:{0}年{1}月{2}日。" , lYear, lMonth - 1, lDay); } else { Console.WriteLine( "今年的阴历日期:{0}年{1}月{2}日。" , lYear, lMonth, lDay); } } else { Console.WriteLine( "今年的阴历日期:{0}年{1}月{2}日。" , lYear, lMonth, lDay); } Console.WriteLine( "今天的公历日期:" + DateTime.Now.ToString( "yyyy-MM-dd" )); Console.WriteLine( "今年阴历天数:{0},今年{1}闰年" , chineseDate.GetDaysInYear(DateTime.Now.Year),(chineseDate.IsLeapYear(DateTime.Now.Year)== true )? "是" : "不是" ); Console.WriteLine( "今年农历每月的天数:" ); //注意:如果有13个数字表示当年有闰月 for ( int i = 1; i <= chineseDate.GetMonthsInYear(DateTime.Now.Year); i++) { Console.Write( "{0,-5}" ,chineseDate.GetDaysInMonth(DateTime.Now.Year,i)); } } } } |
当前时间的运行效果:
2009年闰5月第一天的运行效果(手动调整了系统时间):
闰5月过后第一天的效果:
经过修正算法之后的正常显示结果,原来的问题是在公历2010年年初、农历2009年年末这样阴历有闰月的年份会出现错误情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架