C#计算八字

    protected void Page_Load(object sender, EventArgs e)
    {
        DateTime d = DateTime.Now;
        string dateStr = d.ToLocalTime().ToString();
        string s = dateStr.Split(' ')[0];
        s = s.Replace("/", "-");
        string time1 = dateStr.Split(' ')[1];
        string ygz = "";
        string mz = getMonthz(s);
        if (mz.Equals("丑"))
        {
            ygz = getYearJz(int.Parse(s.Split('-')[0]) - 1);
        }
        else
        {
            ygz = getYearJz(int.Parse(s.Split('-')[0]));
        }
        string mgz = getMonthg(ygz, mz);
        string dgz = getDaygz(s);
        string hz = getHourdz(time1.Split(':')[0]);
        int h = int.Parse(time1.Split(':')[0]);
        if (h == 23)
        {
            dgz = getDaygz(s);
            int dgzIndex = Array.IndexOf(dz, dgz);
            if (dgzIndex == 59)
            {
                dgz = dz[0];
            }
            else
            {
                dgzIndex++;
                dgz = dz[dgzIndex];
            }
        }
        string hgz = getHourgz(hz, dgz);
        Response.Write(ygz + " " + mgz + " " + dgz + " " + hgz);
    }
    //节气间隔计算类
    private class dateTimeForJq 
    {
        public string day { get; set; }
        public string jieqi { get; set; }
        public int jieqiNum { get; set; }
        public int diff { get; set; }
    }
    //五虎遁、五鼠遁
    private class dun 
    {
        public string gan { get; set; }
        public string month { get; set; }
        public string hour { get; set; }
        public dun(string _gan,string _month,string _hour) 
        {
            gan = _gan;
            month = _month;
            hour = _hour;
        }
    }
    //五虎遁、五鼠遁
    List<dun> dunlist = new List<dun>{
        new dun("甲","丙寅","甲子"),
        new dun("己","丙寅","甲子"),
        new dun("乙","戊寅","丙子"),
        new dun("庚","戊寅","丙子"),
        new dun("丙","庚寅","戊子"),
        new dun("辛","庚寅","戊子"),
        new dun("丁","壬寅","庚子"),
        new dun("壬","壬寅","庚子"),
        new dun("戊","甲寅","壬子"),
        new dun("癸","甲寅","壬子")};

    private class Gong 
    {
        public int id { get; set; }
        public int wx { get; set; }
        public string shen { get; set; }
        public string door { get; set; }
        public string star { get; set; }
        public string dpg { get; set; }
        public string tpg { get; set; }
    }
    //二十四节气
    private string[] jq = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };
    //月地支排列
    private string[] dz = { "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥", "子" };
    //时地支排列
    private string[] dzh = { "亥", "子" ,"丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌"};
    //六十甲子表
    public static string[] date = { "甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉", 
                                    "甲戌", "乙亥", "丙子", "丁丑", "戊寅", "乙卯", "庚辰", "辛巳", "壬午", "癸未", 
                                    "甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳", 
                                    "甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸卯", 
                                    "甲辰", "乙巳", "丙午", "丁未", "戊申", "乙酉", "庚戌", "辛亥", "壬子", "癸丑", 
                                    "甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥" };


    //得到年干支
    private string getYearJz(int year) {
        int res = (year - 3) % 60;
        res=(res!=0)?(res-1):59;
        return date[res];
    }
    //月支
    private string getMonthz(string s)
    {
        string yz = "";
        string yg = "";
        Dictionary<int, int> qjInt = new Dictionary<int, int>();
        int a1 = diff(s);

        //算出一年的24节气
        for (int i = 0; i < 24; i++)
        {
            int a = getJq(int.Parse(s.Split('-')[0]) - 1, i);
            int a2 = a1 - a;
            qjInt.Add(a, a2);
        }
        for (int i = 0; i < 24; i++)
        {
            int a = getJq(int.Parse(s.Split('-')[0]), i);
            int a2 = a1 - a;
            qjInt.Add(a, a2);
        }
        for (int i = 0; i < 24; i++)
        {
            int a = getJq(int.Parse(s.Split('-')[0]) + 1, i);
            int a2 = a1 - a;
            qjInt.Add(a, a2);
        }
        List<dateTimeForJq> list = new List<dateTimeForJq>();
        for (int i = 0; i < qjInt.Count; i++)
        {
            dateTimeForJq dateJq = new dateTimeForJq();
            dateJq.day = diffDay(qjInt.ToList()[i].Key);
            dateJq.jieqi = jq[i % 24];
            dateJq.jieqiNum = i % 24;
            dateJq.diff = qjInt.ToList()[i].Value;
            list.Add(dateJq);
        }
        list = list.Where(t => Math.Abs(t.diff) <= 15).ToList();
        dateTimeForJq jq1 = list[0];
        //算出当前日期所在月份
        int m = 0;
        if (jq1.jieqiNum % 2 == 0 && jq1.diff >= 0)
        {
            m = jq1.jieqiNum;
        }
        else
        {
            if (list[1].diff == 0)
            {
                m = list[1].jieqiNum;
            }
            else
            {
                m = jq1.jieqiNum - 1;
            }

        }
        if (m == -1)
        {
            yz = "丑";
        }
        else
        {
            m = m % 24 == 0 ? 12 : (m / 2);
            yz = dz[m % 12];
        }
        return yz;
    }
    //月干
    private string getMonthg(string ygz, string mz)
    {
        string yg = ygz.Substring(0, 1);
        string ymg = dunlist.Where(t => t.gan.Equals(yg)).ToList()[0].month;
        int bjs = Array.IndexOf(dz, mz);
        bjs = bjs - 1;
        if (bjs < 0)
        {
            bjs = bjs + 12;
        }
        int gzindex = Array.IndexOf(date, ymg);
        gzindex = (gzindex + bjs) % 60;
        gzindex = (gzindex != 0) ? (gzindex) : 59;
        return date[gzindex];
    }
    //日干支
    private string getDaygz(string s)
    {
        int a = diff(s);
        int b = Array.IndexOf(date, "甲戌");
        int c = (a) % 60;
        c += b;
        c %= 60;
        c = (c != 0) ? (c - 1) : 59;
        return date[c];

    }
    //时支
    private string getHourdz(string p)
    {
        int a = int.Parse(p);
        int shang = a / 2;
        int yu = a % 2;
        if (yu == 0)
        {
            shang = shang - 1;
            shang %= 12;
            return dz[shang];
        }
        else
        {
            return dz[shang];
        }
    }
    //时干支
    private string getHourgz(string hz, string dgz)
    {
        string dg = dgz.Substring(0, 1);
        string zhg = dunlist.Where(t => t.gan.Equals(dg)).ToList()[0].hour;
        int bjs = Array.IndexOf(dzh, hz);
        int cha = bjs-1;
        if (cha < 0)
        {
            cha = cha + 12;
        }
        int gzindex = Array.IndexOf(date, zhg);
        gzindex = (gzindex + cha) % 60;
        gzindex = (gzindex != 0) ? (gzindex) : 59;
        return date[gzindex];
    }
    //计算节气
    private int getJq(int year, int seq)
    {
        double l = 365.242 * (year - 1900) + 6.2 + 15.22 * seq - 1.9 * Math.Sin(0.262 * seq);
        int a = (int)Math.Floor(l);
        return a;
    }
    private int diff(string str1)
    {
        int year1 = int.Parse(str1.Split('-')[0]);
        int month1 = int.Parse(str1.Split('-')[1]);
        int day1 = int.Parse(str1.Split('-')[2]);
        DateTime date1 = new DateTime(year1, month1, day1);
        DateTime date2 = new DateTime(1899, 12, 31);
        TimeSpan diff = date1.Subtract(date2);
        return (int)diff.TotalDays;
    }
    private string diffDay(int a) 
    {
        DateTime d = new DateTime(1899, 12, 31);
        d = d.AddDays(a);
        return d.ToShortDateString();
    }

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值