重新学C#编程157-求农历(转贴)

原帖地址

C# 计算农历日期方法(2021版)_逐浪CMS发哥的博客-CSDN博客

public static class ChinaDate
{
  private static ChineseLunisolarCalendar china = new ChineseLunisolarCalendar();
  private static Hashtable gHoliday = new Hashtable();
  private static Hashtable nHoliday = new Hashtable();
  private static string[] JQ = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };
  private static int[] JQData = { 0, 21208, 43467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758 };

  static ChinaDate()
  {
  //公历节日
  gHoliday.Add("0101", "元旦");
  gHoliday.Add("0214", "情人节");
  gHoliday.Add("0305", "雷锋日");
  gHoliday.Add("0308", "妇女节");
  gHoliday.Add("0312", "植树节");
  gHoliday.Add("0315", "消费者权益日");
  gHoliday.Add("0401", "愚人节");
  gHoliday.Add("0501", "劳动节");
  gHoliday.Add("0504", "青年节");
  gHoliday.Add("0601", "儿童节");
  gHoliday.Add("0701", "建党节");
  gHoliday.Add("0801", "建军节");
  gHoliday.Add("0910", "教师节");
  gHoliday.Add("1001", "国庆节");
  gHoliday.Add("1224", "平安夜");
  gHoliday.Add("1225", "圣诞节");

  //农历节日
  nHoliday.Add("0101", "春节");
  nHoliday.Add("0115", "元宵节");
  nHoliday.Add("0505", "端午节");
  nHoliday.Add("0815", "中秋节");
  nHoliday.Add("0909", "重阳节");
  nHoliday.Add("1208", "腊八节");
}

/// <summary>
/// 获取农历
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string GetChinaDate(DateTime dt)
{
  if (dt > china.MaxSupportedDateTime || dt < china.MinSupportedDateTime)
  {
    //日期范围:1901 年 2 月 19 日 - 2101 年 1 月 28 日
    throw new Exception(string.Format("日期超出范围!必须在{0}到{1}之间!", china.MinSupportedDateTime.ToString("yyyy-MM-dd"), china.MaxSupportedDateTime.ToString("yyyy-MM-dd")));
  }
  string str = string.Format("{0} {1}{2}", GetYear(dt), GetMonth(dt), GetDay(dt));
  string strJQ = GetSolarTerm(dt);
  if (strJQ != "")
  {
    str += " (" + strJQ + ")";
  }
  string strHoliday = GetHoliday(dt);
  if (strHoliday != "")
  {
    str += " " + strHoliday;
  }
  string strChinaHoliday = GetChinaHoliday(dt);
  if (strChinaHoliday != "")
  {
    str += " " + strChinaHoliday;
  }

  return str;
}

/// <summary>
/// 获取农历年份
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string GetYear(DateTime dt)
{
  int yearIndex = china.GetSexagenaryYear(dt);
  string yearTG = " 甲乙丙丁戊己庚辛壬癸";
  string yearDZ = " 子丑寅卯辰巳午未申酉戌亥";
  string yearSX = " 鼠牛虎兔龙蛇马羊猴鸡狗猪";
  int year = china.GetYear(dt);
  int yTG = china.GetCelestialStem(yearIndex);
  int yDZ = china.GetTerrestrialBranch(yearIndex);

  string str = string.Format("[{1}]{2}{3}{0}", year, yearSX[yDZ], yearTG[yTG], yearDZ[yDZ]);
  return str;
}

/// <summary>
/// 获取农历月份
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string GetMonth(DateTime dt)
{
  int year = china.GetYear(dt);
  int iMonth = china.GetMonth(dt);
  int leapMonth = china.GetLeapMonth(year);
  bool isLeapMonth = iMonth == leapMonth;
  if (leapMonth != 0 && iMonth >= leapMonth)
  {
    iMonth--;
  }

  string szText = "正二三四五六七八九十";
  string strMonth = isLeapMonth ? "闰" : "";
  if (iMonth <= 10)
  {
    strMonth += szText.Substring(iMonth - 1, 1);
  }
  else if (iMonth == 11)
  {
    strMonth += "十一";
  }
  else
  {
    strMonth += "腊";
  }
  return strMonth + "月";

}

/// <summary>
/// 获取农历日期
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string GetDay(DateTime dt)
{
  int iDay = china.GetDayOfMonth(dt);
  string szText1 = "初十廿三";
  string szText2 = "一二三四五六七八九十";
  string strDay;
  if (iDay == 20)
  {
    strDay = "二十";
  }
  else if (iDay == 30)
  {
    strDay = "三十";
  }
  else
  {
    strDay = szText1.Substring((iDay - 1) / 10, 1);
    strDay = strDay + szText2.Substring((iDay - 1) % 10, 1);
  }
  return strDay;
}

/// <summary>
/// 获取节气
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string GetSolarTerm(DateTime dt)
{
  DateTime dtBase = new DateTime(1900, 1, 6, 2, 5, 0);
  DateTime dtNew;
  double num;
  int y;
  string strReturn = "";

  y = dt.Year;
  for (int i = 1; i <= 24; i++)
  {
    num = 525948.76 * (y - 1900) + JQData[i - 1];
    dtNew = dtBase.AddMinutes(num);
    if (dtNew.DayOfYear == dt.DayOfYear)
    {
      strReturn = JQ[i - 1];
    }
  }

  return strReturn;
}

/// <summary>
/// 获取公历节日
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string GetHoliday(DateTime dt)
{
  string strReturn = "";
  object g = gHoliday[dt.Month.ToString("00") + dt.Day.ToString("00")];
  if (g != null)
  {
    strReturn = g.ToString();
  }

  return strReturn;
}

/// <summary>
/// 获取农历节日
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string GetChinaHoliday(DateTime dt)
{
  string strReturn = "";
  int year = china.GetYear(dt);
  int iMonth = china.GetMonth(dt);
  int leapMonth = china.GetLeapMonth(year);
  int iDay = china.GetDayOfMonth(dt);
  if (china.GetDayOfYear(dt) == china.GetDaysInYear(year))
  {
    strReturn = "除夕";
  }
  else if (leapMonth != iMonth)
  {
    if (leapMonth != 0 && iMonth >= leapMonth)
    {
      iMonth--;
    }
    object n = nHoliday[iMonth.ToString("00") + iDay.ToString("00")];
    if (n != null)
    {
      if (strReturn == "")
      {
        strReturn = n.ToString();
      }
      else
      {
        strReturn += " " + n.ToString();
      }
    }
  }

  return strReturn;
}
}
在窗体上放置一个日期时间控件,一个按钮,一个label控件,一个文本框控件

最前面添加以下语句

using System.Globalization;//这一条很重要
using System.Collections;

按钮的鼠标点击事件代码如下

private void button1_Click(object sender, EventArgs e)
{
  textBox1.Text = ChinaDate.GetChinaDate(dateTimePicker1.Value);
}

运行程序,选日期时间后点击按钮,文本框就会显示当前的农历信息了

posted @ 2021-07-01 10:23  来自金沙江的小鱼  阅读(58)  评论(0编辑  收藏  举报