C#获取农历日期

最近在写UWP应用,其中有个功能是可以显示出农历的日期,具体期望实现的效果如下图:

万分感谢的是在网上找到了具体的例子:来自 Bluestorm’s Space 的博客实现的功能

在此基础之上稍微进行了修改:

public class TimeTools
{
    ///<summary>
    /// ChineseLunisolarCalendar(using System.Globalization)
    ///</summary>
    private static ChineseLunisolarCalendar ChineseCalendar = new ChineseLunisolarCalendar();

    ///<summary>
    /// 十天干
    ///</summary>
    private static string[] tg = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };

    ///<summary>
    /// 十二地支
    ///</summary>
    private static string[] dz = { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };

    ///<summary>
    /// 十二生肖
    ///</summary>
    private static string[] sx = { "鼠", "牛", "虎", "免", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };

    ///<summary>
    /// 返回农历天干地支年
    ///</summary>
    ///<param name="year">农历年</param>
    ///<return s></return s>
    private static string GetLunisolarYear(int year)
    {
        if (year > 3)
        {
            int tgIndex = (year - 4) % 10;
            int dzIndex = (year - 4) % 12;
            return string.Concat(tg[tgIndex], dz[dzIndex], "[", sx[dzIndex], "]");
        }
        throw new ArgumentOutOfRangeException("GetLunisolarYearERROR:年份无效");
    }

    ///<summary>
    /// 农历月
    ///</summary>
    ///<return s></return s>
    private static string[] months = { "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二(腊)" };

    ///<summary>
    /// 农历日
    ///</summary>
    private static string[] days1 = { "初", "十", "廿", "三" };

    ///<summary>
    /// 农历日
    ///</summary>
    private static string[] days = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" };
        
    ///<summary>
    /// 返回农历月
    ///</summary>
    ///<param name="month">月份</param>
    ///<return s></return s>
    private static string GetLunisolarMonth(int month)
    {
        if (month < 13 && month > 0)
        {
            return months[month - 1];
        }
        throw new ArgumentOutOfRangeException("GetLunisolarMonthERROR:无效的月份");
    }

    ///<summary>
    /// 返回农历日
    ///</summary>
    ///<param name="day">天</param>
    ///<return s></return s>
    private static string GetLunisolarDay(int day)
    {
        if (day > 0 && day < 32)
        {
            if (day != 20 && day != 30)
            {
                return string.Concat(days1[(day - 1) / 10], days[(day - 1) % 10]);
            }
            else
            {
                return string.Concat(days[(day - 1) / 10], days1[1]);
            }
        }
        throw new ArgumentOutOfRangeException("GetLunisolarDayERROR:无效的日期");
    }
        
    ///<summary>
    /// 根据公历获取农历日期
    ///</summary>
    ///<param name="datetime">公历日期</param>
    ///<return s></return s>
    private static string GetChineseDateTime(DateTime datetime)
    {
        int year = ChineseCalendar.GetYear(datetime);
        int month = ChineseCalendar.GetMonth(datetime);
        int day = ChineseCalendar.GetDayOfMonth(datetime);
        //获取闰月, 0 则表示没有闰月
        int leapMonth = ChineseCalendar.GetLeapMonth(year);
        bool isleap = false;
        if (leapMonth > 0)
        {
            if (leapMonth == month)
            {
                //闰月
                isleap = true;
                month--;
            }
            else if (month > leapMonth)
            {
                month--;
            }
        }
        return string.Concat(GetLunisolarYear(year), "年", isleap ? "闰" : string.Empty, GetLunisolarMonth(month), "月", GetLunisolarDay(day));
    }

    public static string GetAllDateTime(DateTime dateTime)
    {
        return dateTime.Year.ToString() + "年" + dateTime.Month.ToString() + "月" + dateTime.Day.ToString() + "日  " + GetChineseDateTime(dateTime) + "  " + dateTime.Hour + ":" + dateTime.Minute + ":" + dateTime.Second;
    }
}

完美的实现了实时刷新时间及日期的功能

再次感谢 Bluestorm’s Space