键盘敲击者cncxz

  博客园  :: 首页  ::  :: 联系 :: 订阅 订阅  :: 管理

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

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



相关代码如下:


    
/// <summary>
    
/// 中国日历信息实体类
    
/// cncxz(虫虫) 2007-2-9
    
/// </summary>

    public sealed class ChineseCalendarInfo
    
{
        
private DateTime m_SolarDate;
        
private int m_LunarYear, m_LunarMonth, m_LunarDay;
        
private bool m_IsLeapMonth = false;
        
private string m_LunarYearSexagenary = null, m_LunarYearAnimal = null;
        
private string m_LunarYearText = null, m_LunarMonthText = null, m_LunarDayText = null;
        
private string m_SolarWeekText = null, m_SolarConstellation = null, m_SolarBirthStone = null;

        
构造函数

        
日历属性

        
/// <summary>
        
/// 根据指定阳历日期计算星座&诞生石
        
/// </summary>
        
/// <param name="date">指定阳历日期</param>
        
/// <param name="constellation">星座</param>
        
/// <param name="birthstone">诞生石</param>

        public static void CalcConstellation(DateTime date, out string constellation, out string birthstone)
        
{
            
int i = Convert.ToInt32(date.ToString("MMdd"));
            
int j;
            
if (i >= 321 && i <= 419)
                j 
= 0;
            
else if (i >= 420 && i <= 520)
                j 
= 1;
            
else if (i >= 521 && i <= 621)
                j 
= 2;
            
else if (i >= 622 && i <= 722)
                j 
= 3;
            
else if (i >= 723 && i <= 822)
                j 
= 4;
            
else if (i >= 823 && i <= 922)
                j 
= 5;
            
else if (i >= 923 && i <= 1023)
                j 
= 6;
            
else if (i >= 1024 && i <= 1121)
                j 
= 7;
            
else if (i >= 1122 && i <= 1221)
                j 
= 8;
            
else if (i >= 1222 || i <= 119)
                j 
= 9;
            
else if (i >= 120 && i <= 218)
                j 
= 10;
            
else if (i >= 219 && i <= 320)
                j 
= 11;
            
else
            
{
                constellation 
= "未知星座";
                birthstone 
= "未知诞生石";
                
return;
            }

            constellation 
= Constellations[j];
            birthstone 
= BirthStones[j];

            
星座划分
        }



        
阴历转阳历

        
从阴历创建日历

        
private static ChineseLunisolarCalendar calendar = new ChineseLunisolarCalendar();
        
public const string ChineseNumber = "〇一二三四五六七八九";
        
public const string CelestialStem = "甲乙丙丁戊己庚辛壬癸";
        
public const string TerrestrialBranch = "子丑寅卯辰巳午未申酉戌亥";
        
public const string Animals = "鼠牛虎兔龙蛇马羊猴鸡狗猪";
        
public static readonly string[] ChineseWeekName = new string[] "星期天""星期一""星期二""星期三""星期四""星期五""星期六" };
        
public static readonly string[] ChineseDayName = new string[] {
            
"初一","初二","初三","初四","初五","初六","初七","初八","初九","初十",
            
"十一","十二","十三","十四","十五","十六","十七","十八","十九","二十",
            
"廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"}
;
        
public static readonly string[] ChineseMonthName = new string[] """""""""""""""""""""十一""十二" };
        
public static readonly string[] Constellations = new string[] "白羊座""金牛座""双子座""巨蟹座""狮子座""处女座""天秤座""天蝎座""射手座""摩羯座""水瓶座""双鱼座" };
        
public static readonly string[] BirthStones = new string[] "钻石""蓝宝石""玛瑙""珍珠""红宝石""红条纹玛瑙""蓝宝石""猫眼石""黄宝石""土耳其玉""紫水晶""月长石,血石" };


    }

工程文件下载:https://files.cnblogs.com/cncxz/ChineseCalendar.rar
posted on 2007-02-09 21:32  cncxz(虫虫)  阅读(6877)  评论(26编辑  收藏  举报