基于组件的C#农历算法
2005-05-17 11:24
337 查看
// 下面是一个关于C#的农历算法 // 日期数据定义方法如下 // 前12个字节代表1-12月为大月或是小月,1为大月30天,0为小月29天, // 第13位为闰月的情况,1为大月30天,0为小月29天,第14、15位为闰月的月 // 份,使用10进制表示。最后4位为当年家农历新年-即农历1月1日所在公历 // 的日期,如0131代表1月31日。 // 日期函数使用方式如下i公历年为要输入的公历年,i公历月为公历月,i公历日为 // 公历日,返回值为:属相 ,天干地支,农历年农历月农历日。 using System; namespace 农历组件 { public class 农历 { private string[] m_str农历日历表; private string[] m_str天干地支表; private string m_str属相表; private string m_str农历月表; private string m_str农历日表; private int m_i最大公历年份; private int m_i最小公历年份; public 农历() { m_str农历日历表 = new string[] { "0100101101101080131", "0100101011100000219", "1010010101110000208", "0101001001101050129", "1101001001100000216", "1101100101010000204", "0110101010101040125", "0101011010100000213", "1001101011010000202", "0100101011101020122", "0100101011100000210", "1010010011011060130", "1010010011010000218", "1101001001010000206", "1101010101001050126", "1011010101010000214", "0101011010100000204", "1001011011010020123", "1001010110110000211", "0100100110111070201", "0100100110110000220", "1010010010110000208", "1011001001011050128", "0110101001010000216", "0110110101000000205", "1010110110101040124", "0010101101100000213", "1001010101110000202", "0100100101111020123", "0100100101110000210", "0110010010110060130", "1101010010100000217", "1110101001010000206", "0110110101001050126", "0101101011010000214", "0010101101100000204", "1001001101110030124", "1001001011100000211", "1100100101101070131", "1100100101010000219", "1101010010100000208", "1101101001010060127", "1011010101010000215", "0101011010100000205", "1010101011011040125", "0010010111010000213", "1001001011010000202", "1100100101011020122", "1010100101010000210", "1011010010101070129", "0110110010100000217", "1011010101010000206", "0101010110101050127", "0100110110100000214", "1010010110110000203", "0101001010111030124", "0101001010110000212", "1010100101010080131", "1110100101010000218", "0110101010100000208", "1010110101010060128", "1010101101010000215", "0100101101100000205", "1010010101110040125", "1010010101110000213", "0101001001100000202", "1110100100110030121", "1101100101010000209", "0101101010101070130", "0101011010100000217", "1001011011010000206", "0100101011101050127", "0100101011010000215", "1010010011010000203", "1101001001101040123", "1101001001010000211", "1101010100101080131", "1011010101000000218", "1011011010100000207", "1001011011010060128", "1001010110110000216", "0100100110110000205", "1010010010111040125", "1010010010110000213", "1011001001011100202", "0110101001010000220", "0110110101000000209", "1010110110101060129", "1010101101100000217", "1001001101110000206", "0100100101111050127", "0100100101110000215", "0110010010110000204", "0110101001010030123", "1110101001010000210", "0110101100101080131", "0101101011000000219", "1010101101100000207", "1001001101101050128", "1001001011100000216", "1100100101100000205", "1101010010101040124", "1101010010100000212", "1101101001010000201", "0101101010101020122", "0101011010100000209", "1010101011011070129", "0010010111010000218", "1001001011010000207", "1100100101011050126", "1010100101010000214", "1011010010100000214" }; m_str属相表 = "鼠牛虎兔龙蛇马羊猴鸡狗猪"; m_str农历月表 = "正二三四五六七八九十寒腊"; m_str农历日表 = "初一初二初三初四初五初六初七初八初九初十十一十二十三十四十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十"; m_i最大公历年份 = 2011; m_i最小公历年份 = 1900; string str天干 = "甲乙丙丁戊已庚辛壬癸"; string str地支 = "子丑寅卯辰巳午未申酉戌亥"; m_str天干地支表 = new string[60]; for (int i = 0; i < 60; i++) { m_str天干地支表[i] = str天干.Substring(i % 10, 1) + str地支.Substring(i % 12, 1); } } public string 日期(int i公历年, int i公历月, int i公历日) { if ( (i公历年 < m_i最小公历年份) || (i公历年 > m_i最大公历年份) ) { //如果不是有效公历日期,退出。 return "无效公历年份"; } // 计算农历年 int i农历年; int i农历月; int i农历日; i农历年 = i公历年; // 农历新年月份 i农历月 = Convert.ToInt32((m_str农历日历表[i农历年 - m_i最小公历年份].Substring(15, 2))); // 农历新年日子 i农历日= Convert.ToInt32((m_str农历日历表[i农历年 - m_i最小公历年份].Substring(17, 2)));; if ( (i公历月 < i农历月) || ( (i公历月 == i农历月) && (i公历日 < i农历日)) ) { i农历年--; // 农历新年月份 i农历月 = Convert.ToInt32((m_str农历日历表[i农历年 - m_i最小公历年份].Substring(15, 2))); // 农历新年日子 i农历日= Convert.ToInt32((m_str农历日历表[i农历年 - m_i最小公历年份].Substring(17, 2)));; } // 计算农历月 DateTime dt公历日期 = new DateTime(i公历年, i公历月, i公历日); DateTime dt农历日期 = new DateTime(i农历年, i农历月, i农历日); TimeSpan ts日期差 = dt公历日期 - dt农历日期; int i天数 = ts日期差.Days; i农历月 = 1; i农历日 = 1; bool b闰月 = false; for (int i = 0; i < i天数; i++) { i农历日++; if (i农历日 == 30 + Convert.ToInt32(m_str农历日历表[i农历年 - m_i最小公历年份].Substring(i农历月 - 1, 1)) || (b闰月 && ( i农历日 == 30 + Convert.ToInt32( m_str农历日历表[i农历年 - m_i最小公历年份].Substring(12, 1) ) )) ) { if ( (b闰月 == false) && (i农历月 == Convert.ToInt32(m_str农历日历表[i农历年 - m_i最小公历年份].Substring(13, 2))) ) { b闰月= true; } else { b闰月 = false; i农历月++; } i农历日 = 1; } else { } } // 计算农历日 string str农历日 = m_str农历日表.Substring((i农历日 -1) * 2, 2); // 计算农历月 string str农历月 = m_str农历月表.Substring(i农历月 - 1, 1) + "月"; if (b闰月) { str农历月 = "闰" + str农历月; } // 农历年 string str农历年 = Convert.ToString(i农历年, 10) + "年"; // 计算天干地支 string str天干地支 = m_str天干地支表[ (i农历年 - 4) % 60 ]; // 计算属相 string str属相 = m_str属相表.Substring((i农历年 - 4) % 12, 1); // 返回农历日期 return str属相 + "," + str天干地支 + "," + str农历年 + str农历月 + str农历日; } } } 参考:VB计算农历的算法 thinkeasy |
相关文章推荐
- 基于组件的C#农历算法
- 基于组件的C#农历算法
- 基于组件的C#农历算法
- 基于组件的C#农历算法
- 基于C#代码实现九宫格算法横竖都等于4
- 精心设计的基于组件的C# Win Forms实践 一个框架数据库驱动多个业务逻辑数据库
- 精心设计的基于组件的C# Win Forms实践 一个框架数据库驱动多个业务逻辑数据库
- 基于组件技术的C#开发 ---深度聚集
- C#(9):基于组件的程序设计
- C# 公农历算法 ChineseLunisolarCalendar的一点思路
- c#中异步基于消息通信的完成端口的TCP/IP协议的组件实现(源代码) 服务器端
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
- 关于C#的农历算法
- 基于组件技术的C#开发 ---组件分类系统 ---角色分类系统
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
- 基于折线生成平行线的C#算法实现
- C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想
- 基于C#的算法导论中的算法实现(一)