JAVA农历转公历,公历转农历算法


public class Lunar    {        private int year;        private int month;        private int day;        private boolean leap;        final static String chineseNumber[] =        { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };        final static String Big_Or_Small[] =        { "大", "小", "大", "小", "大", "小", "大", "大", "小", "大", "小", "大" };        private String[] LunarHolDayName =        { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至",                "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪",                "冬至" };           static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(                " yyyy年MM月dd日 ");        final static long[] lunarInfo = new long[]        {  0x04bd80x04ae00x0a5700x054d50x0d2600x0d9500x165540x056a0,                 0x09ad00x055d20x04ae00x0a5b60x0a4d00x0d2500x1d255,                 0x0b5400x0d6a00x0ada20x095b00x149770x049700x0a4b0,                 0x0b4b50x06a500x06d400x1ab540x02b600x095700x052f2,                 0x049700x065660x0d4a00x0ea500x06e950x05ad00x02b60,                 0x186e30x092e00x1c8d70x0c9500x0d4a00x1d8a60x0b550,                 0x056a00x1a5b40x025d00x092d00x0d2b20x0a9500x0b557,                 0x06ca00x0b5500x153550x04da00x0a5d00x145730x052d0,                 0x0a9a80x0e9500x06aa00x0aea60x0ab500x04b600x0aae4,                 0x0a5700x052600x0f2630x0d9500x05b570x056a00x096d0,                 0x04dd50x04ad00x0a4d00x0d4d40x0d2500x0d5580x0b540,                 0x0b5a00x195a60x095b00x049b00x0a9740x0a4b00x0b27a,                 0x06a500x06d400x0af460x0ab600x095700x04af50x04970,                 0x064b00x074a30x0ea500x06b580x055c00x0ab600x096d5,                 0x092e00x0c9600x0d9540x0d4a00x0da500x075520x056a0,                 0x0abb70x025d00x092d00x0cab50x0a9500x0b4a00x0baa4,                 0x0ad500x055d90x04ba00x0a5b00x151760x052b00x0a930,                 0x079540x06aa00x0ad500x05b520x04b600x0a6e60x0a4e0,                 0x0d2600x0ea650x0d5300x05aa00x076a30x096d00x04bd7,                 0x04ad00x0a4d00x1d0b60x0d2500x0d5200x0dd450x0b5a0,                 0x056d00x055b20x049b00x0a5770x0a4b00x0aa500x1b255,                 0x06d200x0ada0 };           // ====== 传回农历 y年的总天数        final private static int yearDays(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));        }           // ====== 传回农历 y年闰月的天数        final private static int leapDays(int y)        {            if (leapMonth(y) !=  0)            {                if ((lunarInfo[y -  1900] &  0x10000) !=  0)                    return  30;                else                   return  29;            }            else               return  0;        }           // ====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0        final private static int leapMonth(int y)        {            return (int) (lunarInfo[y -  1900] &  0xf);        }           // ====== 传回农历 y年m月的总天数        final private static int monthDays(int y, int m)        {            if ((lunarInfo[y -  1900] & ( 0x10000 >> m)) ==  0)                return  29;            else               return  30;        }           // ====== 传回农历 y年的生肖        final public String animalsYear()        {            final String[] Animals = new String[]            { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };            return Animals[(year -  4) %  12];        }           // ====== 传入 月日的offset 传回干支, 0=甲子        final private static String cyclicalm(int num)        {            final String[] Gan = new String[]            { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };            final String[] Zhi = new String[]            { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };            return (Gan[num %  10] + Zhi[num %  12]);        }           // ====== 传入 offset 传回干支, 0=甲子        final public String cyclical()        {            int num = year -  1900 +  36;            return (cyclicalm(num));        }           /** */       /**        * 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数 ? monCyl4:从1900年1月31日以来,闰月数        * dayCyl5:与1900年1月31日相差的天数,再加40 ?        *         * @param cal        * @return        */       public Lunar(Calendar cal)        {            // cal.add(cal.get(Calendar.DAY_OF_MONTH),1);             @SuppressWarnings(" unused ")            int yearCyl, monCyl, dayCyl;            int leapMonth =  0;            Date baseDate = null;            try           {                baseDate = chineseDateFormat.parse(" 1900年1月31日 ");            }            catch (ParseException e)            {                e.printStackTrace(); // To change body of catch statement use                                     // Options | File Templates.            }               // 求出和1900年1月31日相差的天数            int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);            dayCyl = offset +  40;            monCyl =  14;               // 用offset减去每农历年的天数            // 计算当天是农历第几天            // i最终结果是农历的年份            // offset是当年的第几天            int iYear, daysOfYear =  0;            for (iYear =  1900; iYear <  2050 && offset >  0; iYear++)            {                daysOfYear = yearDays(iYear);                offset -= daysOfYear;                monCyl +=  12;            }            if (offset <  0)            {                offset += daysOfYear;                iYear--;                monCyl -=  12;            }            // 农历年份            year = iYear;               yearCyl = iYear -  1864;            leapMonth = leapMonth(iYear); // 闰哪个月,1-12            leap = false;               // 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天            int iMonth, daysOfMonth =  0;            for (iMonth =  1; iMonth <  13 && offset >  0; iMonth++)            {                // 闰月                if (leapMonth >  0 && iMonth == (leapMonth +  1) && !leap)                {                    --iMonth;                    leap = true;                    daysOfMonth = leapDays(year);                }                else                   daysOfMonth = monthDays(year, iMonth);                   offset -= daysOfMonth;                // 解除闰月                if (leap && iMonth == (leapMonth +  1))                    leap = false;                if (!leap)                    monCyl++;            }            // offset为0时,并且刚才计算的月份是闰月,要校正            if (offset ==  0 && leapMonth >  0 && iMonth == leapMonth +  1)            {                if (leap)                {                    leap = false;                }                else               {                    leap = true;                    --iMonth;                    --monCyl;                }            }            // offset小于0时,也要校正            if (offset <  0)            {                offset += daysOfMonth;                --iMonth;                --monCyl;            }            month = iMonth;            day = offset +  1;        }           public static String getChinaDayString(int day)        {            String chineseTen[] =            { "初", "十", "廿", "卅" };            int n = day %  10 ==  0 ?  9 : day %  10 -  1;            if (day >  30)                return "";            if (day ==  10)                return "初十";            else               return chineseTen[day /  10] + chineseNumber[n];        }           public String toString()        {            return /* cyclical() + "年" + */(leap ? "闰" : "")                    + chineseNumber[month -  1] + "月" + getChinaDayString(day);        }           public String numeric_md()        {// 返回阿拉伯数字的阴历日期            String temp_day;            String temp_mon;            temp_mon = month <  10 ? "0" + month : "" + month;            temp_day = day <  10 ? "0" + day : "" + day;               return temp_mon + temp_day;        }           public String get_month()        {// 返回阴历的月份            return chineseNumber[month -  1];        }           public String get_date()        {// 返回阴历的天            return getChinaDayString(day);        }           public String get_Big_Or_Small()        {// 返回的月份的大或小            return Big_Or_Small[month -  1];        }       }  

你可能感兴趣的:(程序设计,java)