C\#달력 류 기능 의 인 스 턴 스 코드
using System;
namespace DotNet.Utilities
{
/// <summary>
///
/// </summary>
public class CNDate
{
/// <summary>
/// ( )
/// </summary>
public int cnIntYear = 0;
/// <summary>
/// ( )
/// </summary>
public int cnIntMonth = 0;
/// <summary>
/// ( )
/// </summary>
public int cnIntDay = 0;
/// <summary>
/// ( )
/// </summary>
public string cnStrYear = "";
/// <summary>
/// ( )
/// </summary>
public string cnStrMonth = "";
/// <summary>
/// ( )
/// </summary>
public string cnStrDay = "";
/// <summary>
///
/// </summary>
public string cnAnm = "";
/// <summary>
///
/// </summary>
public string cnSolarTerm = "";
/// <summary>
///
/// </summary>
public string cnFtvl = "";
/// <summary>
///
/// </summary>
public string cnFtvs = "";
}
/// <summary>
///
/// </summary>
public class ChinaDate
{
#region
private static long[] lunarInfo = new long[] { 0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554,
0x056a0, 0x09ad0, 0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0,
0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566,
0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550,
0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0,
0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263,
0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0,
0x195a6, 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5,
0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960, 0x0d954, 0x0d4a0,
0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9,
0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0,
0x0d260, 0x0ea65, 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520,
0x0dd45, 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0 };
private static int[] year20 = new int[] { 1, 4, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1 };
private static int[] year19 = new int[] { 0, 3, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 };
private static int[] year2000 = new int[] { 0, 3, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1 };
private static String[] nStr1 = new String[] { "", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " };
private static String[] Gan = new String[] { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " };
private static String[] Zhi = new String[] { " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " };
private static String[] Animals = new String[] { " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " };
private static String[] solarTerm = new String[] { " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " };
private static int[] sTermInfo = { 0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758 };
private static String[] lFtv = new String[] { "0101 ", "0202 ", "0115 ", "0505 ", "0707 ", "0815 ", "0909 ", "1208 ", "1114 ", "1224 ", "0100 " };
private static String[] sFtv = new String[] { "0101 ",
"0202 ",
"0207 ",
"0210 ",
"0214 ",
"0301 ",
"0303 ",
"0308 ",
"0312 ",
"0314 ",
"0315 ",
"0317 ",
"0321 ",
"0321 ",
"0322 ",
"0323 ",
"0324 ",
"0325 ",
"0330 ",
"0401 ( ) ( )",
"0407 ",
"0422 ",
"0423 ",
"0424 ",
"0501 ",
"0504 ",
"0505 ",
"0508 ",
"0512 ",
"0515 ",
"0517 ",
"0518 ",
"0520 ",
"0523 ",
"0531 ",
"0601 ",
"0605 ",
"0606 ",
"0617 ",
"0623 ",
"0625 ",
"0626 ",
"0701 gongchandang ",
"0702 ",
"0707 ",
"0711 ",
"0730 ",
"0801 ",
"0808 ( )",
"0815 ",
"0908 ",
"0910 ",
"0914 ",
"0916 ",
"0918 ・ ",
"0920 ",
"0927 ",
"1001 ",
"1001 ",
"1002 ",
"1004 ",
"1008 ",
"1008 ",
"1009 ",
"1010 ",
"1013 ",
"1014 ",
"1015 ( )",
"1016 ",
"1017 ",
"1022 ",
"1024 ",
"1031 ",
"1107 ",
"1108 ",
"1109 ",
"1110 ",
"1111 ( )",
"1112 ",
"1114 ",
"1117 ",
"1121 ",
"1129 ",
"1201 ",
"1203 ",
"1205 ",
"1208 ",
"1209 ",
"1210 ",
"1212 ",
"1213 (1937 ) ! !",
"1221 ",
"1224 ",
"1225 ",
"1226 ",
"1229 " };
/// <summary>
/// y
/// </summary>
private static int lYearDays(int y)
{
int i, sum = 348;
for (i = 0x8000; i > 0x8; i >>= 1)
{
if ((lunarInfo[y - 1900] & i) != 0)
sum += 1;
}
return (sum + leapDays(y));
}
/// <summary>
/// y
/// </summary>
private static int leapDays(int y)
{
if (leapMonth(y) != 0)
{
if ((lunarInfo[y - 1900] & 0x10000) != 0)
return 30;
else
return 29;
}
else
return 0;
}
/// <summary>
/// y 1-12 , 0
/// </summary>
private static int leapMonth(int y)
{
return (int)(lunarInfo[y - 1900] & 0xf);
}
/// <summary>
/// y m
/// </summary>
private static int monthDays(int y, int m)
{
if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
return 29;
else
return 30;
}
/// <summary>
/// y
/// </summary>
private static String AnimalsYear(int y)
{
return Animals[(y - 4) % 12];
}
/// <summary>
/// offset ,0=
/// </summary>
private static String cyclicalm(int num)
{
return (Gan[num % 10] + Zhi[num % 12]);
}
/// <summary>
/// offset , 0=
/// </summary>
private static String cyclical(int y)
{
int num = y - 1900 + 36;
return (cyclicalm(num));
}
/// <summary>
/// .year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
/// </summary>
private long[] Lunar(int y, int m)
{
long[] nongDate = new long[7];
int i = 0, temp = 0, leap = 0;
DateTime baseDate = new DateTime(1900 + 1900, 2, 31);
DateTime objDate = new DateTime(y + 1900, m + 1, 1);
TimeSpan ts = objDate - baseDate;
long offset = (long)ts.TotalDays;
if (y < 2000)
offset += year19[m - 1];
if (y > 2000)
offset += year20[m - 1];
if (y == 2000)
offset += year2000[m - 1];
nongDate[5] = offset + 40;
nongDate[4] = 14;
for (i = 1900; i < 2050 && offset > 0; i++)
{
temp = lYearDays(i);
offset -= temp;
nongDate[4] += 12;
}
if (offset < 0)
{
offset += temp;
i--;
nongDate[4] -= 12;
}
nongDate[0] = i;
nongDate[3] = i - 1864;
leap = leapMonth(i); //
nongDate[6] = 0;
for (i = 1; i < 13 && offset > 0; i++)
{
//
if (leap > 0 && i == (leap + 1) && nongDate[6] == 0)
{
--i;
nongDate[6] = 1;
temp = leapDays((int)nongDate[0]);
}
else
{
temp = monthDays((int)nongDate[0], i);
}
//
if (nongDate[6] == 1 && i == (leap + 1))
nongDate[6] = 0;
offset -= temp;
if (nongDate[6] == 0)
nongDate[4]++;
}
if (offset == 0 && leap > 0 && i == leap + 1)
{
if (nongDate[6] == 1)
{
nongDate[6] = 0;
}
else
{
nongDate[6] = 1;
--i;
--nongDate[4];
}
}
if (offset < 0)
{
offset += temp;
--i;
--nongDate[4];
}
nongDate[1] = i;
nongDate[2] = offset + 1;
return nongDate;
}
/// <summary>
/// y m d .year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
/// </summary>
private static long[] calElement(int y, int m, int d)
{
long[] nongDate = new long[7];
int i = 0, temp = 0, leap = 0;
DateTime baseDate = new DateTime(1900, 1, 31);
DateTime objDate = new DateTime(y, m, d);
TimeSpan ts = objDate - baseDate;
long offset = (long)ts.TotalDays;
nongDate[5] = offset + 40;
nongDate[4] = 14;
for (i = 1900; i < 2050 && offset > 0; i++)
{
temp = lYearDays(i);
offset -= temp;
nongDate[4] += 12;
}
if (offset < 0)
{
offset += temp;
i--;
nongDate[4] -= 12;
}
nongDate[0] = i;
nongDate[3] = i - 1864;
leap = leapMonth(i); //
nongDate[6] = 0;
for (i = 1; i < 13 && offset > 0; i++)
{
//
if (leap > 0 && i == (leap + 1) && nongDate[6] == 0)
{
--i;
nongDate[6] = 1;
temp = leapDays((int)nongDate[0]);
}
else
{
temp = monthDays((int)nongDate[0], i);
}
//
if (nongDate[6] == 1 && i == (leap + 1))
nongDate[6] = 0;
offset -= temp;
if (nongDate[6] == 0)
nongDate[4]++;
}
if (offset == 0 && leap > 0 && i == leap + 1)
{
if (nongDate[6] == 1)
{
nongDate[6] = 0;
}
else
{
nongDate[6] = 1;
--i;
--nongDate[4];
}
}
if (offset < 0)
{
offset += temp;
--i;
--nongDate[4];
}
nongDate[1] = i;
nongDate[2] = offset + 1;
return nongDate;
}
private static String getChinaDate(int day)
{
String a = "";
if (day == 10)
return " ";
if (day == 20)
return " ";
if (day == 30)
return " ";
int two = (int)((day) / 10);
if (two == 0)
a = " ";
if (two == 1)
a = " ";
if (two == 2)
a = " ";
if (two == 3)
a = " ";
int one = (int)(day % 10);
switch (one)
{
case 1:
a += " ";
break;
case 2:
a += " ";
break;
case 3:
a += " ";
break;
case 4:
a += " ";
break;
case 5:
a += " ";
break;
case 6:
a += " ";
break;
case 7:
a += " ";
break;
case 8:
a += " ";
break;
case 9:
a += " ";
break;
}
return a;
}
private static DateTime sTerm(int y, int n)
{
double ms = 31556925974.7 * (y - 1900);
double ms1 = sTermInfo[n];
DateTime offDate = new DateTime(1900, 1, 6, 2, 5, 0);
offDate = offDate.AddMilliseconds(ms);
offDate = offDate.AddMinutes(ms1);
return offDate;
}
static string FormatDate(int m, int d)
{
return string.Format("{0:00}{1:00}", m, d);
}
#endregion
#region
/// <summary>
/// y m
/// </summary>
public static int GetDaysByMonth(int y, int m)
{
int[] days = new int[] { 31, DateTime.IsLeapYear(y) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
return days[m - 1];
}
/// <summary>
///
/// </summary>
/// <param name="dt"> </param>
/// <returns> </returns>
public static DateTime GetMondayDateByDate(DateTime dt)
{
double d = 0;
switch ((int)dt.DayOfWeek)
{
//case 1: d = 0; break;
case 2: d = -1; break;
case 3: d = -2; break;
case 4: d = -3; break;
case 5: d = -4; break;
case 6: d = -5; break;
case 0: d = -6; break;
}
return dt.AddDays(d);
}
/// <summary>
///
/// </summary>
public static CNDate getChinaDate(DateTime dt)
{
CNDate cd = new CNDate();
int year = dt.Year;
int month = dt.Month;
int date = dt.Day;
long[] l = calElement(year, month, date);
cd.cnIntYear = (int)l[0];
cd.cnIntMonth = (int)l[1];
cd.cnIntDay = (int)l[2];
cd.cnStrYear = cyclical(year);
cd.cnAnm = AnimalsYear(year);
cd.cnStrMonth = nStr1[(int)l[1]];
cd.cnStrDay = getChinaDate((int)(l[2]));
string smd = dt.ToString("MMdd");
string lmd = FormatDate(cd.cnIntMonth, cd.cnIntDay);
for (int i = 0; i < solarTerm.Length; i++)
{
string s1 = sTerm(dt.Year, i).ToString("MMdd");
if (s1.Equals(dt.ToString("MMdd")))
{
cd.cnSolarTerm = solarTerm[i];
break;
}
}
foreach (string s in sFtv)
{
string s1 = s.Substring(0, 4);
if (s1.Equals(smd))
{
cd.cnFtvs = s.Substring(4, s.Length - 4);
break;
}
}
foreach (string s in lFtv)
{
string s1 = s.Substring(0, 4);
if (s1.Equals(lmd))
{
cd.cnFtvl = s.Substring(4, s.Length - 4);
break;
}
}
dt = dt.AddDays(1);
year = dt.Year;
month = dt.Month;
date = dt.Day;
l = calElement(year, month, date);
lmd = FormatDate((int)l[1], (int)l[2]);
if (lmd.Equals("0101")) cd.cnFtvl = " ";
return cd;
}
#endregion
}
/// <summary>
///
/// </summary>
//-------------------------------------------------------------------------------
// :
//ChineseCalendar c = new ChineseCalendar(new DateTime(1990, 01, 15));
//StringBuilder dayInfo = new StringBuilder();
//dayInfo.Append(" :" + c.DateString + "\r
");
//dayInfo.Append(" :" + c.ChineseDateString + "\r
");
//dayInfo.Append(" :" + c.WeekDayStr);
//dayInfo.Append(" :" + c.ChineseHour + "\r
");
//dayInfo.Append(" :" + c.AnimalString + "\r
");
//dayInfo.Append(" :" + c.ChineseTwentyFourDay + "\r
");
//dayInfo.Append(" :" + c.ChineseTwentyFourPrevDay + "\r
");
//dayInfo.Append(" :" + c.ChineseTwentyFourNextDay + "\r
");
//dayInfo.Append(" :" + c.DateHoliday + "\r
");
//dayInfo.Append(" :" + c.GanZhiDateString + "\r
");
//dayInfo.Append(" :" + c.ChineseConstellation + "\r
");
//dayInfo.Append(" :" + c.Constellation + "\r
");
//-------------------------------------------------------------------------------
public class ChineseCalendar
{
#region
/// <summary>
///
/// </summary>
private struct SolarHolidayStruct
{
public int Month;
public int Day;
public int Recess; //
public string HolidayName;
public SolarHolidayStruct(int month, int day, int recess, string name)
{
Month = month;
Day = day;
Recess = recess;
HolidayName = name;
}
}
/// <summary>
///
/// </summary>
private struct LunarHolidayStruct
{
public int Month;
public int Day;
public int Recess;
public string HolidayName;
public LunarHolidayStruct(int month, int day, int recess, string name)
{
Month = month;
Day = day;
Recess = recess;
HolidayName = name;
}
}
private struct WeekHolidayStruct
{
public int Month;
public int WeekAtMonth;
public int WeekDay;
public string HolidayName;
public WeekHolidayStruct(int month, int weekAtMonth, int weekDay, string name)
{
Month = month;
WeekAtMonth = weekAtMonth;
WeekDay = weekDay;
HolidayName = name;
}
}
#endregion
#region
private DateTime _date;
private DateTime _datetime;
private int _cYear;
private int _cMonth;
private int _cDay;
private bool _cIsLeapMonth; //
private bool _cIsLeapYear; //
#endregion
#region
#region
private const int MinYear = 1900;
private const int MaxYear = 2050;
private static DateTime MinDay = new DateTime(1900, 1, 30);
private static DateTime MaxDay = new DateTime(2049, 12, 31);
private const int GanZhiStartYear = 1864; //
private static DateTime GanZhiStartDay = new DateTime(1899, 12, 22);//
private const string HZNum = " ";
private const int AnimalStartYear = 1900; //1900
private static DateTime ChineseConstellationReferDay = new DateTime(2007, 9, 13);//28 ,
#endregion
#region
/// <summary>
///
/// </summary>
/// <remarks>
/// , 17
/// 17 : ,0 29 1 30
/// 16 - 5 ( 12 ) 12 , 16 , 30 1,29 0
/// 4 - 1 ( 4 ) , , 0
///</remarks>
private static int[] LunarDateArray = new int[]{
0x04BD8,0x04AE0,0x0A570,0x054D5,0x0D260,0x0D950,0x16554,0x056A0,0x09AD0,0x055D2,
0x04AE0,0x0A5B6,0x0A4D0,0x0D250,0x1D255,0x0B540,0x0D6A0,0x0ADA2,0x095B0,0x14977,
0x04970,0x0A4B0,0x0B4B5,0x06A50,0x06D40,0x1AB54,0x02B60,0x09570,0x052F2,0x04970,
0x06566,0x0D4A0,0x0EA50,0x06E95,0x05AD0,0x02B60,0x186E3,0x092E0,0x1C8D7,0x0C950,
0x0D4A0,0x1D8A6,0x0B550,0x056A0,0x1A5B4,0x025D0,0x092D0,0x0D2B2,0x0A950,0x0B557,
0x06CA0,0x0B550,0x15355,0x04DA0,0x0A5B0,0x14573,0x052B0,0x0A9A8,0x0E950,0x06AA0,
0x0AEA6,0x0AB50,0x04B60,0x0AAE4,0x0A570,0x05260,0x0F263,0x0D950,0x05B57,0x056A0,
0x096D0,0x04DD5,0x04AD0,0x0A4D0,0x0D4D4,0x0D250,0x0D558,0x0B540,0x0B6A0,0x195A6,
0x095B0,0x049B0,0x0A974,0x0A4B0,0x0B27A,0x06A50,0x06D40,0x0AF46,0x0AB60,0x09570,
0x04AF5,0x04970,0x064B0,0x074A3,0x0EA50,0x06B58,0x055C0,0x0AB60,0x096D5,0x092E0,
0x0C960,0x0D954,0x0D4A0,0x0DA50,0x07552,0x056A0,0x0ABB7,0x025D0,0x092D0,0x0CAB5,
0x0A950,0x0B4A0,0x0BAA4,0x0AD50,0x055D9,0x04BA0,0x0A5B0,0x15176,0x052B0,0x0A930,
0x07954,0x06AA0,0x0AD50,0x05B52,0x04B60,0x0A6E6,0x0A4E0,0x0D260,0x0EA65,0x0D530,
0x05AA0,0x076A3,0x096D0,0x04BD7,0x04AD0,0x0A4D0,0x1D0B6,0x0D250,0x0D520,0x0DD45,
0x0B5A0,0x056D0,0x055B2,0x049B0,0x0A577,0x0A4B0,0x0AA50,0x1B255,0x06D20,0x0ADA0,
0x14B63
};
#endregion
#region
private static string[] _constellationName =
{
" ", " ", " ",
" ", " ", " ",
" ", " ", " ",
" ", " ", " "
};
#endregion
#region
private static string[] _lunarHolidayName =
{
" ", " ", " ", " ",
" ", " ", " ", " ",
" ", " ", " ", " ",
" ", " ", " ", " ",
" ", " ", " ", " ",
" ", " ", " ", " "
};
#endregion
#region
private static string[] _chineseConstellationName =
{
//
" "," "," "," "," "," "," ",
" "," "," "," "," "," "," ",
" "," "," "," "," "," "," ",
" "," "," "," "," "," "," "
};
#endregion
#region
private static string[] SolarTerm = new string[] { " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " };
private static int[] sTermInfo = new int[] { 0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758 };
#endregion
#region
private static string ganStr = " ";
private static string zhiStr = " ";
private static string animalStr = " ";
private static string nStr1 = " ";
private static string nStr2 = " ";
private static string[] _monthString =
{
" "," "," "," "," "," "," "," "," "," "," "," "," "
};
#endregion
#region
private static SolarHolidayStruct[] sHolidayInfo = new SolarHolidayStruct[]{
new SolarHolidayStruct(1, 1, 1, " "),
new SolarHolidayStruct(2, 2, 0, " "),
new SolarHolidayStruct(2, 10, 0, " "),
new SolarHolidayStruct(2, 14, 0, " "),
new SolarHolidayStruct(3, 1, 0, " "),
new SolarHolidayStruct(3, 5, 0, " "),
new SolarHolidayStruct(3, 8, 0, " "),
new SolarHolidayStruct(3, 12, 0, " "),
new SolarHolidayStruct(3, 14, 0, " "),
new SolarHolidayStruct(3, 15, 0, " "),
new SolarHolidayStruct(3, 17, 0, " "),
new SolarHolidayStruct(3, 21, 0, " "),
new SolarHolidayStruct(3, 22, 0, " "),
new SolarHolidayStruct(3, 24, 0, " "),
new SolarHolidayStruct(4, 1, 0, " "),
new SolarHolidayStruct(4, 7, 0, " "),
new SolarHolidayStruct(4, 22, 0, " "),
new SolarHolidayStruct(5, 1, 1, " "),
new SolarHolidayStruct(5, 2, 1, " "),
new SolarHolidayStruct(5, 3, 1, " "),
new SolarHolidayStruct(5, 4, 0, " "),
new SolarHolidayStruct(5, 8, 0, " "),
new SolarHolidayStruct(5, 12, 0, " "),
new SolarHolidayStruct(5, 31, 0, " "),
new SolarHolidayStruct(6, 1, 0, " "),
new SolarHolidayStruct(6, 5, 0, " "),
new SolarHolidayStruct(6, 26, 0, " "),
new SolarHolidayStruct(7, 1, 0, " "),
new SolarHolidayStruct(7, 11, 0, " "),
new SolarHolidayStruct(8, 1, 0, " "),
new SolarHolidayStruct(8, 8, 0, " "),
new SolarHolidayStruct(8, 15, 0, " "),
new SolarHolidayStruct(9, 9, 0, " "),
new SolarHolidayStruct(9, 10, 0, " "),
new SolarHolidayStruct(9, 18, 0, " ・ "),
new SolarHolidayStruct(9, 20, 0, " "),
new SolarHolidayStruct(9, 27, 0, " "),
new SolarHolidayStruct(9, 28, 0, " "),
new SolarHolidayStruct(10, 1, 1, " "),
new SolarHolidayStruct(10, 2, 1, " "),
new SolarHolidayStruct(10, 3, 1, " "),
new SolarHolidayStruct(10, 6, 0, " "),
new SolarHolidayStruct(10, 24, 0, " "),
new SolarHolidayStruct(11, 10, 0, " "),
new SolarHolidayStruct(11, 12, 0, " "),
new SolarHolidayStruct(12, 1, 0, " "),
new SolarHolidayStruct(12, 3, 0, " "),
new SolarHolidayStruct(12, 20, 0, " "),
new SolarHolidayStruct(12, 24, 0, " "),
new SolarHolidayStruct(12, 25, 0, " "),
new SolarHolidayStruct(12, 26, 0, " ")
};
#endregion
#region
private static LunarHolidayStruct[] lHolidayInfo = new LunarHolidayStruct[]{
new LunarHolidayStruct(1, 1, 1, " "),
new LunarHolidayStruct(1, 15, 0, " "),
new LunarHolidayStruct(5, 5, 0, " "),
new LunarHolidayStruct(7, 7, 0, " "),
new LunarHolidayStruct(7, 15, 0, " "),
new LunarHolidayStruct(8, 15, 0, " "),
new LunarHolidayStruct(9, 9, 0, " "),
new LunarHolidayStruct(12, 8, 0, " "),
new LunarHolidayStruct(12, 23, 0, " ( )"),
new LunarHolidayStruct(12, 24, 0, " ( )"),
//new LunarHolidayStruct(12, 30, 0, " ") //
};
#endregion
#region
private static WeekHolidayStruct[] wHolidayInfo = new WeekHolidayStruct[]{
new WeekHolidayStruct(5, 2, 1, " "),
new WeekHolidayStruct(5, 3, 1, " "),
new WeekHolidayStruct(6, 3, 1, " "),
new WeekHolidayStruct(9, 3, 3, " "),
new WeekHolidayStruct(9, 4, 1, " "),
new WeekHolidayStruct(10, 1, 2, " "),
new WeekHolidayStruct(10, 1, 4, " "),
new WeekHolidayStruct(11, 4, 5, " ")
};
#endregion
#endregion
#region
#region
/// <summary>
///
/// </summary>
public ChineseCalendar(DateTime dt)
{
int i;
int leap;
int temp;
int offset;
CheckDateLimit(dt);
_date = dt.Date;
_datetime = dt;
//
leap = 0;
temp = 0;
//
TimeSpan ts = _date - ChineseCalendar.MinDay;
offset = ts.Days;
for (i = MinYear; i <= MaxYear; i++)
{
//
temp = GetChineseYearDays(i);
if (offset - temp < 1)
break;
else
{
offset = offset - temp;
}
}
_cYear = i;
//
leap = GetChineseLeapMonth(_cYear);
//
if (leap > 0)
{
_cIsLeapYear = true;
}
else
{
_cIsLeapYear = false;
}
_cIsLeapMonth = false;
for (i = 1; i <= 12; i++)
{
//
if ((leap > 0) && (i == leap + 1) && (_cIsLeapMonth == false))
{
_cIsLeapMonth = true;
i = i - 1;
temp = GetChineseLeapMonthDays(_cYear); //
}
else
{
_cIsLeapMonth = false;
temp = GetChineseMonthDays(_cYear, i); //
}
offset = offset - temp;
if (offset <= 0) break;
}
offset = offset + temp;
_cMonth = i;
_cDay = offset;
}
#endregion
#region
/// <summary>
///
/// </summary>
/// <param name="cy"> </param>
/// <param name="cm"> </param>
/// <param name="cd"> </param>
/// <param name="LeapFlag"> </param>
public ChineseCalendar(int cy, int cm, int cd, bool leapMonthFlag)
{
int i, leap, Temp, offset;
CheckChineseDateLimit(cy, cm, cd, leapMonthFlag);
_cYear = cy;
_cMonth = cm;
_cDay = cd;
offset = 0;
for (i = MinYear; i < cy; i++)
{
//
Temp = GetChineseYearDays(i);
offset = offset + Temp;
}
//
leap = GetChineseLeapMonth(cy);
if (leap != 0)
{
this._cIsLeapYear = true;
}
else
{
this._cIsLeapYear = false;
}
if (cm != leap)
{
//
_cIsLeapMonth = false;
}
else
{
//
_cIsLeapMonth = leapMonthFlag;
}
// ||
if ((_cIsLeapYear == false) || (cm < leap))
{
for (i = 1; i < cm; i++)
{
Temp = GetChineseMonthDays(cy, i);//
offset = offset + Temp;
}
//
if (cd > GetChineseMonthDays(cy, cm))
{
throw new Exception(" ");
}
//
offset = offset + cd;
}
// ,
else
{
for (i = 1; i < cm; i++)
{
//
Temp = GetChineseMonthDays(cy, i);
offset = offset + Temp;
}
//
if (cm > leap)
{
Temp = GetChineseLeapMonthDays(cy); //
offset = offset + Temp; //
if (cd > GetChineseMonthDays(cy, cm))
{
throw new Exception(" ");
}
offset = offset + cd;
}
//
else
{
// ,
if (this._cIsLeapMonth == true) //
{
Temp = GetChineseMonthDays(cy, cm); //
offset = offset + Temp;
}
if (cd > GetChineseLeapMonthDays(cy))
{
throw new Exception(" ");
}
offset = offset + cd;
}
}
_date = MinDay.AddDays(offset);
}
#endregion
#endregion
#region
#region GetChineseMonthDays
/// <summary>
/// // y m
/// </summary>
private int GetChineseMonthDays(int year, int month)
{
if (BitTest32((LunarDateArray[year - MinYear] & 0x0000FFFF), (16 - month)))
{
return 30;
}
else
{
return 29;
}
}
#endregion
#region GetChineseLeapMonth
/// <summary>
/// y 1-12 , 0
/// </summary>
private int GetChineseLeapMonth(int year)
{
return LunarDateArray[year - MinYear] & 0xF;
}
#endregion
#region GetChineseLeapMonthDays
/// <summary>
/// y
/// </summary>
private int GetChineseLeapMonthDays(int year)
{
if (GetChineseLeapMonth(year) != 0)
{
if ((LunarDateArray[year - MinYear] & 0x10000) != 0)
{
return 30;
}
else
{
return 29;
}
}
else
{
return 0;
}
}
#endregion
#region GetChineseYearDays
/// <summary>
///
/// </summary>
private int GetChineseYearDays(int year)
{
int i, f, sumDay, info;
sumDay = 348; //29 *12
i = 0x8000;
info = LunarDateArray[year - MinYear] & 0x0FFFF;
// 12 30
for (int m = 0; m < 12; m++)
{
f = info & i;
if (f != 0)
{
sumDay++;
}
i = i >> 1;
}
return sumDay + GetChineseLeapMonthDays(year);
}
#endregion
#region GetChineseHour
/// <summary>
///
/// </summary>
private string GetChineseHour(DateTime dt)
{
int _hour, _minute, offset, i;
int indexGan;
string ganHour, zhiHour;
string tmpGan;
//
_hour = dt.Hour; //
_minute = dt.Minute; //
if (_minute != 0) _hour += 1;
offset = _hour / 2;
if (offset >= 12) offset = 0;
//zhiHour = zhiStr[offset].ToString();
//
TimeSpan ts = this._date - GanZhiStartDay;
i = ts.Days % 60;
//ganStr[i % 10] ,(n*2-1) %10 ,n 1
indexGan = ((i % 10 + 1) * 2 - 1) % 10 - 1;
tmpGan = ganStr.Substring(indexGan) + ganStr.Substring(0, indexGan + 2);// 12
//ganHour = ganStr[((i % 10 + 1) * 2 - 1) % 10 - 1].ToString();
return tmpGan[offset].ToString() + zhiStr[offset].ToString();
}
#endregion
#region CheckDateLimit
/// <summary>
///
/// </summary>
private void CheckDateLimit(DateTime dt)
{
if ((dt < MinDay) || (dt > MaxDay))
{
throw new Exception(" ");
}
}
#endregion
#region CheckChineseDateLimit
/// <summary>
///
/// </summary>
private void CheckChineseDateLimit(int year, int month, int day, bool leapMonth)
{
if ((year < MinYear) || (year > MaxYear))
{
throw new Exception(" ");
}
if ((month < 1) || (month > 12))
{
throw new Exception(" ");
}
if ((day < 1) || (day > 30)) // 30
{
throw new Exception(" ");
}
int leap = GetChineseLeapMonth(year);//
if ((leapMonth == true) && (month != leap))
{
throw new Exception(" ");
}
}
#endregion
#region ConvertNumToChineseNum
/// <summary>
/// 0-9
/// </summary>
private string ConvertNumToChineseNum(char n)
{
if ((n < '0') || (n > '9')) return "";
switch (n)
{
case '0':
return HZNum[0].ToString();
case '1':
return HZNum[1].ToString();
case '2':
return HZNum[2].ToString();
case '3':
return HZNum[3].ToString();
case '4':
return HZNum[4].ToString();
case '5':
return HZNum[5].ToString();
case '6':
return HZNum[6].ToString();
case '7':
return HZNum[7].ToString();
case '8':
return HZNum[8].ToString();
case '9':
return HZNum[9].ToString();
default:
return "";
}
}
#endregion
#region BitTest32
/// <summary>
///
/// </summary>
private bool BitTest32(int num, int bitpostion)
{
if ((bitpostion > 31) || (bitpostion < 0))
throw new Exception("Error Param: bitpostion[0-31]:" + bitpostion.ToString());
int bit = 1 << bitpostion;
if ((num & bit) == 0)
{
return false;
}
else
{
return true;
}
}
#endregion
#region ConvertDayOfWeek
/// <summary>
///
/// </summary>
private int ConvertDayOfWeek(DayOfWeek dayOfWeek)
{
switch (dayOfWeek)
{
case DayOfWeek.Sunday:
return 1;
case DayOfWeek.Monday:
return 2;
case DayOfWeek.Tuesday:
return 3;
case DayOfWeek.Wednesday:
return 4;
case DayOfWeek.Thursday:
return 5;
case DayOfWeek.Friday:
return 6;
case DayOfWeek.Saturday:
return 7;
default:
return 0;
}
}
#endregion
#region CompareWeekDayHoliday
/// <summary>
///
/// </summary>
private bool CompareWeekDayHoliday(DateTime date, int month, int week, int day)
{
bool ret = false;
if (date.Month == month) //
{
if (ConvertDayOfWeek(date.DayOfWeek) == day) //
{
DateTime firstDay = new DateTime(date.Year, date.Month, 1);//
int i = ConvertDayOfWeek(firstDay.DayOfWeek);
int firWeekDays = 7 - ConvertDayOfWeek(firstDay.DayOfWeek) + 1; //
if (i > day)
{
if ((week - 1) * 7 + day + firWeekDays == date.Day)
{
ret = true;
}
}
else
{
if (day + firWeekDays + (week - 2) * 7 == date.Day)
{
ret = true;
}
}
}
}
return ret;
}
#endregion
#endregion
#region
#region
#region newCalendarHoliday
/// <summary>
///
/// </summary>
public string newCalendarHoliday
{
get
{
string tempStr = "";
if (this._cIsLeapMonth == false) //
{
foreach (LunarHolidayStruct lh in lHolidayInfo)
{
if ((lh.Month == this._cMonth) && (lh.Day == this._cDay))
{
tempStr = lh.HolidayName;
break;
}
}
//
if (this._cMonth == 12)
{
int i = GetChineseMonthDays(this._cYear, 12); // 12
if (this._cDay == i) //
{
tempStr = " ";
}
}
}
return tempStr;
}
}
#endregion
#region WeekDayHoliday
/// <summary>
///
/// </summary>
public string WeekDayHoliday
{
get
{
string tempStr = "";
foreach (WeekHolidayStruct wh in wHolidayInfo)
{
if (CompareWeekDayHoliday(_date, wh.Month, wh.WeekAtMonth, wh.WeekDay))
{
tempStr = wh.HolidayName;
break;
}
}
return tempStr;
}
}
#endregion
#region DateHoliday
/// <summary>
///
/// </summary>
public string DateHoliday
{
get
{
string tempStr = "";
foreach (SolarHolidayStruct sh in sHolidayInfo)
{
if ((sh.Month == _date.Month) && (sh.Day == _date.Day))
{
tempStr = sh.HolidayName;
break;
}
}
return tempStr;
}
}
#endregion
#endregion
#region
#region Date
/// <summary>
///
/// </summary>
public DateTime Date
{
get { return _date; }
set { _date = value; }
}
#endregion
#region WeekDay
/// <summary>
///
/// </summary>
public DayOfWeek WeekDay
{
get { return _date.DayOfWeek; }
}
#endregion
#region WeekDayStr
/// <summary>
///
/// </summary>
public string WeekDayStr
{
get
{
switch (_date.DayOfWeek)
{
case DayOfWeek.Sunday:
return " ";
case DayOfWeek.Monday:
return " ";
case DayOfWeek.Tuesday:
return " ";
case DayOfWeek.Wednesday:
return " ";
case DayOfWeek.Thursday:
return " ";
case DayOfWeek.Friday:
return " ";
default:
return " ";
}
}
}
#endregion
#region DateString
/// <summary>
///
/// </summary>
public string DateString
{
get
{
return " " + this._date.ToLongDateString();
}
}
#endregion
#region IsLeapYear
/// <summary>
///
/// </summary>
public bool IsLeapYear
{
get
{
return DateTime.IsLeapYear(this._date.Year);
}
}
#endregion
#region ChineseConstellation
/// <summary>
/// 28
/// </summary>
public string ChineseConstellation
{
get
{
int offset = 0;
int modStarDay = 0;
TimeSpan ts = this._date - ChineseConstellationReferDay;
offset = ts.Days;
modStarDay = offset % 28;
return (modStarDay >= 0 ? _chineseConstellationName[modStarDay] : _chineseConstellationName[27 + modStarDay]);
}
}
#endregion
#region ChineseHour
/// <summary>
///
/// </summary>
public string ChineseHour
{
get
{
return GetChineseHour(_datetime);
}
}
#endregion
#endregion
#region
#region IsChineseLeapMonth
/// <summary>
///
/// </summary>
public bool IsChineseLeapMonth
{
get { return this._cIsLeapMonth; }
}
#endregion
#region IsChineseLeapYear
/// <summary>
///
/// </summary>
public bool IsChineseLeapYear
{
get
{
return this._cIsLeapYear;
}
}
#endregion
#region ChineseDay
/// <summary>
///
/// </summary>
public int ChineseDay
{
get { return this._cDay; }
}
#endregion
#region ChineseDayString
/// <summary>
///
/// </summary>
public string ChineseDayString
{
get
{
switch (this._cDay)
{
case 0:
return "";
case 10:
return " ";
case 20:
return " ";
case 30:
return " ";
default:
return nStr2[(int)(_cDay / 10)].ToString() + nStr1[_cDay % 10].ToString();
}
}
}
#endregion
#region ChineseMonth
/// <summary>
///
/// </summary>
public int ChineseMonth
{
get { return this._cMonth; }
}
#endregion
#region ChineseMonthString
/// <summary>
///
/// </summary>
public string ChineseMonthString
{
get
{
return _monthString[this._cMonth];
}
}
#endregion
#region ChineseYear
/// <summary>
///
/// </summary>
public int ChineseYear
{
get { return this._cYear; }
}
#endregion
#region ChineseYearString
/// <summary>
/// ,
/// </summary>
public string ChineseYearString
{
get
{
string tempStr = "";
string num = this._cYear.ToString();
for (int i = 0; i < 4; i++)
{
tempStr += ConvertNumToChineseNum(num[i]);
}
return tempStr + " ";
}
}
#endregion
#region ChineseDateString
/// <summary>
/// :
/// </summary>
public string ChineseDateString
{
get
{
if (this._cIsLeapMonth == true)
{
return " " + ChineseYearString + " " + ChineseMonthString + ChineseDayString;
}
else
{
return " " + ChineseYearString + ChineseMonthString + ChineseDayString;
}
}
}
#endregion
#region ChineseTwentyFourDay
/// <summary>
/// , ,
/// </summary>
/// <remarks>
/// 。 " ", 24 ,
/// 15 , " "。 " ",
/// , 360°, 15°。
/// , , 15° 15 。
/// , , 16 。
/// 、 。
/// </remarks>
public string ChineseTwentyFourDay
{
get
{
DateTime baseDateAndTime = new DateTime(1900, 1, 6, 2, 5, 0); //#1/6/1900 2:05:00 AM#
DateTime newDate;
double num;
int y;
string tempStr = "";
y = this._date.Year;
for (int i = 1; i <= 24; i++)
{
num = 525948.76 * (y - 1900) + sTermInfo[i - 1];
newDate = baseDateAndTime.AddMinutes(num);//
if (newDate.DayOfYear == _date.DayOfYear)
{
tempStr = SolarTerm[i - 1];
break;
}
}
return tempStr;
}
}
//
public string ChineseTwentyFourPrevDay
{
get
{
DateTime baseDateAndTime = new DateTime(1900, 1, 6, 2, 5, 0); //#1/6/1900 2:05:00 AM#
DateTime newDate;
double num;
int y;
string tempStr = "";
y = this._date.Year;
for (int i = 24; i >= 1; i--)
{
num = 525948.76 * (y - 1900) + sTermInfo[i - 1];
newDate = baseDateAndTime.AddMinutes(num);//
if (newDate.DayOfYear < _date.DayOfYear)
{
tempStr = string.Format("{0}[{1}]", SolarTerm[i - 1], newDate.ToString("yyyy-MM-dd"));
break;
}
}
return tempStr;
}
}
//
public string ChineseTwentyFourNextDay
{
get
{
DateTime baseDateAndTime = new DateTime(1900, 1, 6, 2, 5, 0); //#1/6/1900 2:05:00 AM#
DateTime newDate;
double num;
int y;
string tempStr = "";
y = this._date.Year;
for (int i = 1; i <= 24; i++)
{
num = 525948.76 * (y - 1900) + sTermInfo[i - 1];
newDate = baseDateAndTime.AddMinutes(num);//
if (newDate.DayOfYear > _date.DayOfYear)
{
tempStr = string.Format("{0}[{1}]", SolarTerm[i - 1], newDate.ToString("yyyy-MM-dd"));
break;
}
}
return tempStr;
}
}
#endregion
#endregion
#region
/// <summary>
///
/// </summary>
public string Constellation
{
get
{
int index = 0;
int y, m, d;
y = _date.Year;
m = _date.Month;
d = _date.Day;
y = m * 100 + d;
if (((y >= 321) && (y <= 419))) { index = 0; }
else if ((y >= 420) && (y <= 520)) { index = 1; }
else if ((y >= 521) && (y <= 620)) { index = 2; }
else if ((y >= 621) && (y <= 722)) { index = 3; }
else if ((y >= 723) && (y <= 822)) { index = 4; }
else if ((y >= 823) && (y <= 922)) { index = 5; }
else if ((y >= 923) && (y <= 1022)) { index = 6; }
else if ((y >= 1023) && (y <= 1121)) { index = 7; }
else if ((y >= 1122) && (y <= 1221)) { index = 8; }
else if ((y >= 1222) || (y <= 119)) { index = 9; }
else if ((y >= 120) && (y <= 218)) { index = 10; }
else if ((y >= 219) && (y <= 320)) { index = 11; }
else { index = 0; }
return _constellationName[index];
}
}
#endregion
#region
#region Animal
/// <summary>
/// , ,
/// 1,
/// </summary>
public int Animal
{
get
{
int offset = _date.Year - AnimalStartYear;
return (offset % 12) + 1;
}
}
#endregion
#region AnimalString
/// <summary>
///
/// </summary>
public string AnimalString
{
get
{
int offset = _date.Year - AnimalStartYear; //
//int offset = this._cYear - AnimalStartYear;
return animalStr[offset % 12].ToString();
}
}
#endregion
#endregion
#region
#region GanZhiYearString
/// <summary>
///
/// </summary>
public string GanZhiYearString
{
get
{
string tempStr;
int i = (this._cYear - GanZhiStartYear) % 60; //
tempStr = ganStr[i % 10].ToString() + zhiStr[i % 12].ToString() + " ";
return tempStr;
}
}
#endregion
#region GanZhiMonthString
/// <summary>
/// ,
/// </summary>
public string GanZhiMonthString
{
get
{
// ,
int zhiIndex;
string zhi;
if (this._cMonth > 10)
{
zhiIndex = this._cMonth - 10;
}
else
{
zhiIndex = this._cMonth + 2;
}
zhi = zhiStr[zhiIndex - 1].ToString();
//
int ganIndex = 1;
string gan;
int i = (this._cYear - GanZhiStartYear) % 60; //
switch (i % 10)
{
#region ...
case 0: //
ganIndex = 3;
break;
case 1: //
ganIndex = 5;
break;
case 2: //
ganIndex = 7;
break;
case 3: //
ganIndex = 9;
break;
case 4: //
ganIndex = 1;
break;
case 5: //
ganIndex = 3;
break;
case 6: //
ganIndex = 5;
break;
case 7: //
ganIndex = 7;
break;
case 8: //
ganIndex = 9;
break;
case 9: //
ganIndex = 1;
break;
#endregion
}
gan = ganStr[(ganIndex + this._cMonth - 2) % 10].ToString();
return gan + zhi + " ";
}
}
#endregion
#region GanZhiDayString
/// <summary>
///
/// </summary>
public string GanZhiDayString
{
get
{
int i, offset;
TimeSpan ts = this._date - GanZhiStartDay;
offset = ts.Days;
i = offset % 60;
return ganStr[i % 10].ToString() + zhiStr[i % 12].ToString() + " ";
}
}
#endregion
#region GanZhiDateString
/// <summary>
///
/// </summary>
public string GanZhiDateString
{
get
{
return GanZhiYearString + GanZhiMonthString + GanZhiDayString;
}
}
#endregion
#endregion
#endregion
}
}
효과 형식 은 다음 과 같 습 니 다:위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 C\#달력 류 기능 의 인 스 턴 스 코드 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.