农历算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国毕竟是一个文明大国,有一些自己悠久的历史文化传统,农历就是其中之一,它对指导农业生产有着极为重要的意义,还有春节等一些传节日并没有因为使用公元纪年而消失,在程序开发种我们也经常会遇到一些需要在公历与农历之间进行转换,在1.1之前大家都是采用了第三方的算法(我也采用过),现在在.net2.0种已经提供了这种功能了。

下面我就以几个简单的例子展示它的用法。

ing System;
ing System.Collections.Generic;
ing System.Text;
ing System.Globalization;
5./**
6. * 说明:在东亚各国,除了通用的公元纪年之外,还有各自以前使用的阴历纪年法,在.net2.0
种增加了针对东亚各国的日历类EastAsianLunisolarCalendar,
7. * 它是一个抽象类,有各种针对不同国家的的子类,其中ChineseLunisolarCalendar就是针
对中国的日历类,它提公元纪年与中国传统农历纪年之间的相互转换
8. * 利用它可以计算天干地支等有关农历的信息,本程序就是来简单展示这个类的用法。

它能计
算的农历范围从公历1901-2-19至2101-1-28。

9. * 作者:周公
10. * 日期:2007-11-21
11. * 最后维护日期:2010-01-05
12. * 首发地址:/zhoufoxcn/archive/2007/11/21/1896258.aspx
13. */
space ChineseCalendar
15.{
16.public class Calendar
17. {
18.private static ChineseLunisolarCalendar chineseDate = new ChineseLun
isolarCalendar();
19.static void Main(string[] args)
20. {
21.//ChineseLunisolarCalendar chineseDate = new ChineseLunisolarCal
endar();
22. ShowYearInfo();
23. ShowCurrentYearInfo();
24. Console.ReadLine();
25. }
26./// <summary>
27./// 展示阴历年份信息
28./// </summary>
29.public static void ShowYearInfo()
30. {
31.for (int i = chineseDate.MinSupportedDateTime.Year; i < chineseD
ate.MaxSupportedDateTime.Year; i++)
32. {
33. Console.WriteLine("年份:{0},月份总数:{1},总天数:{2},干支序
号:{3}", i, chineseDate.GetMonthsInYear(i),chineseDate.GetDaysInYear(i) 34. ,chineseDate.GetSexagenaryYear(new DateTim
e(i,3,1)));
35. }
36. }
37./// <summary>
38./// 展示当前年份信息
39./// </summary>
40.public static void ShowCurrentYearInfo()
41. {
42.int lYear=chineseDate.GetYear(DateTime.Now);
43.int lMonth=chineseDate.GetMonth(DateTime.Now);
44.int lDay=chineseDate.GetDayOfMonth(DateTime.Now);
45.
46./** GetLeapMonth(int year)方法返回一个1到13之间的数字,
47. * 比如:1、该年阴历2月有闰月,则返回3
48. * 如果:2、该年阴历8月有闰月,则返回9
49. * GetMonth(DateTime dateTime)返回是当前月份,忽略是否闰月
50. * 比如:1、该年阴历2月有闰月,2月返回2,闰2月返回3
51. * 如果:2、该年阴历8月有闰月,8月返回8,闰8月返回9
52. */
53.int leapMonth = chineseDate.GetLeapMonth(lYear);//获取第几个月是闰
月,等于0表示本年无闰月
54.
55.//如果今年有闰月
56.if (leapMonth > 0)
57. {
58.//闰月数等于当前月份
59.if (lMonth == leapMonth)
60. {
61. Console.WriteLine("今年的阴历日期:{0}年闰{1}月{2}日。

", lYear, lMonth - 1, lDay);
62. }
63.else if (lMonth > leapMonth)//
64. {
65. Console.WriteLine("今年的阴历日期:{0}年{1}月{2}日。

", lYear, lMonth - 1, lDay);
66. }
67.else
68. {
69. Console.WriteLine("今年的阴历日期:{0}年{1}月{2}日。

", lYear, lMonth, lDay);
70. }
71.
72. }
73.else
74. {
75. Console.WriteLine("今年的阴历日期:{0}年{1}月{2}日。

", lYear, lMonth, lDay);
76. }
77. Console.WriteLine("今天的公历日期:
" + DateTime.Now.ToString("yyyy-MM-dd"));
78. Console.WriteLine("今年阴历天数:{0},今年{1}闰年
", chineseDate.GetDaysInYear(DateTime.Now.Year),(chineseDate.IsLeapYear(Date Time.Now.Year)==true)?"是":"不是");
79.
80. Console.WriteLine("今年农历每月的天数:");//注意:如果有13个数字表示
当年有闰月
81.for (int i = 1; i <= chineseDate.GetMonthsInYear(DateTime.Now.Ye
ar); i++)
82. {
83. Console.Write("{0,-5}",chineseDate.GetDaysInMonth(DateTime.N
ow.Year,i));
84. }
85. }
86. }
87.}
当前时间的运行效果:
2009年闰5月第一天的运行效果(手动调整了系统时间):
闰5月过后第一天的效果:
经过修正算法之后的正常显示结果,原来的问题是在公历2010年年初、农历2009年年末这样阴历有闰月的年份会出现错误情况。

相关文档
最新文档