查看: 3585|回复: 0

[.NET开发] C#实现的阴历阳历互相转化类实例

发表于 2018-2-9 08:00:00

本文实例讲述了C#实现的阴历阳历互相转化类。分享给大家供大家参考,具体如下:

最近郁闷地发现网上现有的相当一部分万年历上干支纪年的算法都是错误的。因为干支纪年是针对阴历而言的,而生肖属相又跟地支对应,所以元旦和春节之间那段时间在干支纪年法中应该归上一年,以阳历2007年2月9日为例,当日的阴历日期是二〇〇六年十二月廿二日,是丙戌年,即狗年,但是浏览一下目前的万年历,相当一部分都显示成了丁亥年,猪年,比较郁闷~~

然后就写了一个阴历阳历互相转化的类。

相关代码如下:

  1. /// <summary>
  2. /// 中国日历信息实体类
  3. /// </summary>
  4. public sealed class ChineseCalendarInfo
  5. {
  6. private DateTime m_SolarDate;
  7. private int m_LunarYear, m_LunarMonth, m_LunarDay;
  8. private bool m_IsLeapMonth = false;
  9. private string m_LunarYearSexagenary = null, m_LunarYearAnimal = null;
  10. private string m_LunarYearText = null, m_LunarMonthText = null, m_LunarDayText = null;
  11. private string m_SolarWeekText = null, m_SolarConstellation = null, m_SolarBirthStone = null;
  12. 日历属性
  13. /// <summary>
  14. /// 根据指定阳历日期计算星座&诞生石
  15. /// </summary>
  16. /// <param name="date">指定阳历日期</param>
  17. /// <param name="constellation">星座</param>
  18. /// <param name="birthstone">诞生石</param>
  19. public static void CalcConstellation(DateTime date, out string constellation, out string birthstone)
  20. {
  21. int i = Convert.ToInt32(date.ToString("MMdd"));
  22. int j;
  23. if (i >= 321 && i <= 419)
  24. j = 0;
  25. else if (i >= 420 && i <= 520)
  26. j = 1;
  27. else if (i >= 521 && i <= 621)
  28. j = 2;
  29. else if (i >= 622 && i <= 722)
  30. j = 3;
  31. else if (i >= 723 && i <= 822)
  32. j = 4;
  33. else if (i >= 823 && i <= 922)
  34. j = 5;
  35. else if (i >= 923 && i <= 1023)
  36. j = 6;
  37. else if (i >= 1024 && i <= 1121)
  38. j = 7;
  39. else if (i >= 1122 && i <= 1221)
  40. j = 8;
  41. else if (i >= 1222 || i <= 119)
  42. j = 9;
  43. else if (i >= 120 && i <= 218)
  44. j = 10;
  45. else if (i >= 219 && i <= 320)
  46. j = 11;
  47. else
  48. {
  49. constellation = "未知星座";
  50. birthstone = "未知诞生石";
  51. return;
  52. }
  53. constellation = Constellations[j];
  54. birthstone = BirthStones[j];
  55. 星座划分
  56. }
  57. 阴历转阳历
  58. 从阴历创建日历
  59. private static ChineseLunisolarCalendar calendar = new ChineseLunisolarCalendar();
  60. public const string ChineseNumber = "〇一二三四五六七八九";
  61. public const string CelestialStem = "甲乙丙丁戊己庚辛壬癸";
  62. public const string TerrestrialBranch = "子丑寅卯辰巳午未申酉戌亥";
  63. public const string Animals = "鼠牛虎兔龙蛇马羊猴鸡狗猪";
  64. public static readonly string[] ChineseWeekName = new string[] { "星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
  65. public static readonly string[] ChineseDayName = new string[] {
  66. "初一","初二","初三","初四","初五","初六","初七","初八","初九","初十",
  67. "十一","十二","十三","十四","十五","十六","十七","十八","十九","二十",
  68. "廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"};
  69. public static readonly string[] ChineseMonthName = new string[] { "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };
  70. public static readonly string[] Constellations = new string[] { "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座", "水瓶座", "双鱼座" };
  71. public static readonly string[] BirthStones = new string[] { "钻石", "蓝宝石", "玛瑙", "珍珠", "红宝石", "红条纹玛瑙", "蓝宝石", "猫眼石", "黄宝石", "土耳其玉", "紫水晶", "月长石,血石" };
  72. }
复制代码

附:完整实例代码点击此处本站下载

PS:这里再为大家推荐几款日历相关在线工具供大家参考:

网页万年历日历:
http://tools.jb51.net/bianmin/webwannianli

在线阴历/阳历转换工具:
http://tools.jb51.net/bianmin/yinli2yangli

在线万年历日历:
http://tools.jb51.net/bianmin/wannianli

在线万年历黄历flash版:
http://tools.jb51.net/bianmin/flashwnl

另外,本站历史上的今天也有相似的农历日期显示功能:

http://tools.jb51.net/bianmin/lishi

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#日期与时间操作技巧总结》、《C#字符串操作技巧总结》、《C#数组操作技巧总结》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》及《C#面向对象程序设计入门教程》

希望本文所述对大家C#程序设计有所帮助。

您可能感兴趣的文章:

  • C# 常用日期时间函数(老用不熟)
  • c#实现输出本月的月历
  • C#由当前日期计算相应的周一和周日的实例代码
  • c#的时间日期操作示例分享(c#获取当前日期)
  • C#实现带阴历显示的日期代码
  • C#获取上个月第一天和最后一天日期的方法
  • C#实现农历日历的方法
  • C#日期控件datetimepicker保存空值的三种方法
  • C#日历样式的下拉式计算器实例讲解
  • C#简单输出日历的方法
  • C# 日历类功能的实例代码


回复

使用道具 举报