?? calenderconverter.cs
字號:
using System;
using System.Collections.Generic;
using System.Text;
namespace CalendarConverter
{
class CalendarConverter
{
//農歷壓縮數據,從1949~2010的壓縮數據
//從1~12位為每月的大小月信息,大月為1,小月為0
//13為閏月的大小月,閏月為大月則1,為小月則0
//14~15位為閏月的月份
//16~19位為當年農歷正月初一時公歷的日期,若當年2月15日為農歷
//正月初一,則16~19位為0215
static string[] strChineseCalendarData =
{
"1011010010101070129",//1949 [00]
"0110110010100000217",// [01]
"1011010101010000206",
"0101010110101050127",
"0100110110100000214",
"1010010110110000203",
"0101001010111030124",
"0101001010110000212",
"1010100101010080131",
"1110100101010000218",
"0110101010100000208",//1959 [10]
"1010111101010060128",//第七位原為0,1960年9月20日
"1010101101010000215",
"0100101101100000205",
"1010010101110040125",
"1010010101110000213",
"0101001001100000202",
"1110100100110030121",
"1101100101010000209",
"0101101010101070130",
"0101011010100000217",//1969 [20]
"1001011011010000206",
"0100101011101050127",
"0100101011010000215",
"1010010011010000203",
"1101001001101040123",
"1101001001010000211",
"1101010100101080131",
"1011010101000000218",
"1011011010100000207",
"1001011011010060128",//1979 [30]
"1001010110110000216",//1980,計算參考年
"0100100110110000205",
"1010010010111040125",
"1010010010110000213",
"1011001001011100202",
"0110101001010000220",
"0110110101000000209",
"1010110110101060129",
"1010101101100000217",
"1001001101110000206",//1989 [40]
"0100100101111050127",
"0100100101110000215",
"0110010010110000204",
"0110101001010030123",
"1110101001010000210",
"0110101100101080131",
"0101101011000000219",
"1010101101100000207",
"1001001101101050128",
"1001001011100000216",//1999 [50]
"1100100101100000205",
"1101010010101040124",
"1101010010100000212",
"1101101001010000201",
"0101101010101020122",
"0101011010100000209",
"1010101011011070129",
"0010010111010000218",
"1001001011010000207",
"1100100101011050126",//2009 [60]
"1010100101010000214" // [61]
};
//十二生肖
static string[] strAnimalSign =
{
"Mouse",
"Ox",
"Tiger",
"Rabbit",
"Loong",
"Snake",
"Horse",
"Sheep",
"Monkey",
"Chicken",
"Dog",
"Pig"
};
//農歷每天的拼音
static string[] strChinexeCalendarDay =
{
"Chu Yi",
"Chu Er",
"Chu San",
"Chu Si",
"Chu Wu",
"Chu Liu",
"Chu Qi",
"Chu Ba",
"Chu Jiu",
"Chu Shi",
"Shi Yi",
"Shi Er",
"Shi San",
"Shi Si",
"Shi Wu",
"Shi Liu",
"Shi Qi",
"Shi Ba",
"Shi Jiu",
"Er Shi",
"Er Shi Yi",
"Er Shi Er",
"Er Shi San",
"Er Shi Si",
"Er Shi Wu",
"Er Shi Liu",
"Er Shi Qi",
"Er Shi Ba",
"Er Shi Jiu",
"San Shi"
};
//農歷每月的拼音
static string[] strChineseCalendarMonth =
{
"Zheng Yue",
"Er Yue",
"San Yue",
"Si Yue",
"Wu Yue",
"Liu Yue",
"Qi Yue",
"Ba Yue",
"Jiu Yue",
"Shi Yue",
"Dong Yue",
"La Yue"
};
//六十甲子
static string[] strGanZhi =
{
"Jia Zi",// [00]
"Yi Chou",
"Bing Yin",
"Ding Mao",
"Wu Chen",
"Ji Si",
"Geng Wu",
"Xin Mo",
"Ren Shen",
"Gui You",
"Jia Xu",
"Yi Hai",
"Bing Zi",
"Ding Chou",
"Wu Yin",
"Ji Mao",
"Geng Chen",
"Xin Si",
"Ren Wu",
"Gui Mo",
"Jia Shen",
"Yi You",
"Bing Xu",
"Ding Hai",
"Wu Zi",
"Ji Chou",
"Geng Yin",
"Xin Mao",
"Ren Chen",
"Gui Si",
"Jia Wu",
"Yi Mo",
"Bing Shen",
"Ding You",
"Wu Xu",
"Ji Hai",
"Geng Zi",
"Xin Chou",
"Ren Yin",
"Gui Mao",
"Jia Chen",
"Yi Si",
"Bing Wu",
"Ding Mo",
"Wu Shen",
"Ji You",
"Geng Xu",
"Xin Hai",
"Ren Zi",
"Gui Chou",
"Jia Yin",
"Yi Mao",
"Bing Chen",
"Ding Si",
"Wu Wu",
"Ji Mo",
"Geng Shen",//1980年的干支 [56]
"Xin You",
"Ren Xu",
"Gui Hai"
};
//能轉換的最大年限
static int intMaxYear = 2010;
//能轉換的最小年限
static int intMinYear = 1950;
//檢查輸入的公歷是否合法
public static int IsDateRight(int intYear, int intMonth, int intDay)
{
//如果是1、3、5、7、8、10、12月,則每月日期必須在1~31之間
if (intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12)
{
if (intDay >= 1 && intDay <= 31)
{
return 1;
}
}
//如果為二月,閏年中日期必須在1~29天之間
//非閏年日期必須在1~28天之間
if (intMonth == 2)
{
//當年數符合以下兩個條件之一時,判定其為閏年
//1、能被四整除但不能被100整除
//2、能被四百整除
//閏年的二月的日期不必須在1~29天之間
if ((intYear % 4 == 0 && intYear % 100 != 0) || intYear % 400 == 0)
{
if (intDay >= 1 && intDay <= 29)
{
return 1;
}
}
//在非閏年里,二月的日期不能超過28天
else if (intDay >= 1 && intDay <= 28)
{
return 1;
}
}
//如果是4、6、9、11月,則每月日期必須在1~30天之間
if (intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11)
{
if (intDay >= 1 && intDay <= 30)
{
return 1;
}
}
return 0;
}
//將公歷日期轉換成農歷日期
public static string ConvertChineseToGregorian(int intInputGregYear, int intInputGregMonth, int intInputGregDay)
{
//檢查輸入的日期是否在系統轉換的日期范圍之內
if (intInputGregYear > intMaxYear || intInputGregYear < intMinYear)
{
return "The date you input Out of the Convert Range.";
}
//調用IsDateRight來對輸入的日期進行合法性檢查,
if (IsDateRight(intInputGregYear,intInputGregMonth,intInputGregDay) == 0)
{
return "The date you input is illage!";
}
//存儲農歷的年份,初始值取與公歷相同的年數
int intCalcChYear = intInputGregYear;
//存儲農歷的當年的正月初一時的公歷月數
int intCalcChMonth = Convert.ToInt32(strChineseCalendarData[intCalcChYear - intMinYear + 1].Substring(15,2));
//存儲農歷的當年的正月初一時的公歷號數
int intCalcChDay = Convert.ToInt32(strChineseCalendarData[intCalcChYear - intMinYear + 1].Substring(17,2));
//檢查需要轉換的公歷日期和正月初一時的公歷日期的早晚
//如果前者比后者要早,則將農歷年份減一,并重新把相應
//的農歷正月初一的公歷日期存儲到intCalcChMonth和
//intCalcChDay中
if (intInputGregMonth < intCalcChMonth || (intInputGregMonth == intCalcChMonth && intInputGregDay < intCalcChDay))
{
intCalcChDay = intCalcChDay - 1;
intCalcChMonth = Convert.ToInt32(strChineseCalendarData[intCalcChYear - intMinYear + 1].Substring(15,2));
intCalcChDay = Convert.ToInt32(strChineseCalendarData[intCalcChYear - intMinYear + 1].Substring(17,2));
}
//計算需要轉換的公歷和農歷正月初一之間相應的天數
DateTime dtInput = new DateTime(intInputGregYear,intInputGregMonth,intInputGregDay);
DateTime dt = new DateTime(intCalcChYear, intCalcChMonth, intCalcChDay);
TimeSpan ts = dtInput - dt;
//把相關的天數存儲到intTimeSpan這個整型值中
int intTimeSpan = ts.Days;
//將農歷日期值置為正月初一這個農歷日期
intCalcChDay = 1;
intCalcChMonth = 1;
//將農歷當年的年份數據存儲到strThisYear這個字符串中
string strThisYear = strChineseCalendarData[intCalcChYear - intMinYear + 1];
//置閏年標志,其為0表示為平年,其為1表示為閏年
int intIsLeapYear = 0;
//開始循環,循環的界限是輸入的公歷日期與農歷正月初一之間相隔的天數
for (int i = 0; i < intTimeSpan; i++)
{
//先將日子加一
intCalcChDay ++;
//當日子的值在小月達到30或者大月達到31時,把月份遞加一
if (intCalcChDay == 30 + Convert.ToInt32(strThisYear.Substring(intCalcChMonth - 1, 1)) || intIsLeapYear == 1 && (intCalcChDay == 30 + Convert.ToInt32(strThisYear.Substring(12, 1))))
{
//處理閏月時的情況
if (intIsLeapYear == 0 && (intCalcChMonth == Convert.ToInt32(strThisYear.Substring(13, 2))))
{
intIsLeapYear = 1;
}
else
{
intIsLeapYear = 0;
intCalcChMonth++;
}
intCalcChDay = 1;
}
}
//將月份數轉變為漢語拼音
string strCalcChMonth = strChineseCalendarMonth[intCalcChMonth - 1];
//如果是閏月,還要在月份前加個“閏”字
if (intIsLeapYear == 1)
{
strCalcChMonth = "Run " + strCalcChMonth;
}
//根據輸入的公歷日期,求出當天的星期日子
string strWeekDay = Convert.ToString(dtInput.DayOfWeek);
//計算相應的過干支
string strCalcChGanZhi = strGanZhi[(intCalcChYear - 4) % 60];
//計算相應的生肖
string strCalcChAnimalSign = strAnimalSign[(intCalcChYear - 4) % 12];
//將日子轉換變成為漢語拼音
string strCalcChDay = strChinexeCalendarDay[intCalcChDay - 1];
//返回一個完整的表現農歷的字符串
return intCalcChYear + " . " + intCalcChMonth + " . " + intCalcChDay + "\n" + strCalcChAnimalSign + "\n" + strCalcChGanZhi + " . " + strCalcChMonth + " . " + strCalcChDay + "\n" + strWeekDay;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -