C\#달력 류 기능 의 인 스 턴 스 코드

65550 단어 c#달력 클래스
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\#달력 류 기능 의 인 스 턴 스 코드 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기