Java 阳历转阴历 方法

 

  
  
  
  
  1. package com.imedia.tablewidget.util;  
  2.  
  3. /**  
  4.  * 阳历转阴历  
  5.  * */ 
  6. import java.text.ParseException;  
  7. import java.text.SimpleDateFormat;  
  8. import java.util.Calendar;  
  9. import java.util.Date;  
  10.  
  11. import android.util.Log;  
  12.  
  13. public class Lunar {  
  14.     private int year;  
  15.     private int month;  
  16.     private int day;  
  17.     private boolean leap;  
  18.     final static String chineseNumber[] = { "一""二""三""四""五""六""七",  
  19.             "八""九""十""十一""十二" };  
  20.     static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(  
  21.             "yyyy年MM月dd日");  
  22.     final static long[] lunarInfo = new long[] { 0x04bd80x04ae00x0a570,  
  23.             0x054d50x0d2600x0d9500x165540x056a00x09ad00x055d2,  
  24.             0x04ae00x0a5b60x0a4d00x0d2500x1d2550x0b5400x0d6a0,  
  25.             0x0ada20x095b00x149770x049700x0a4b00x0b4b50x06a50,  
  26.             0x06d400x1ab540x02b600x095700x052f20x049700x06566,  
  27.             0x0d4a00x0ea500x06e950x05ad00x02b600x186e30x092e0,  
  28.             0x1c8d70x0c9500x0d4a00x1d8a60x0b5500x056a00x1a5b4,  
  29.             0x025d00x092d00x0d2b20x0a9500x0b5570x06ca00x0b550,  
  30.             0x153550x04da00x0a5d00x145730x052d00x0a9a80x0e950,  
  31.             0x06aa00x0aea60x0ab500x04b600x0aae40x0a5700x05260,  
  32.             0x0f2630x0d9500x05b570x056a00x096d00x04dd50x04ad0,  
  33.             0x0a4d00x0d4d40x0d2500x0d5580x0b5400x0b5a00x195a6,  
  34.             0x095b00x049b00x0a9740x0a4b00x0b27a0x06a500x06d40,  
  35.             0x0af460x0ab600x095700x04af50x049700x064b00x074a3,  
  36.             0x0ea500x06b580x055c00x0ab600x096d50x092e00x0c960,  
  37.             0x0d9540x0d4a00x0da500x075520x056a00x0abb70x025d0,  
  38.             0x092d00x0cab50x0a9500x0b4a00x0baa40x0ad500x055d9,  
  39.             0x04ba00x0a5b00x151760x052b00x0a9300x079540x06aa0,  
  40.             0x0ad500x05b520x04b600x0a6e60x0a4e00x0d2600x0ea65,  
  41.             0x0d5300x05aa00x076a30x096d00x04bd70x04ad00x0a4d0,  
  42.             0x1d0b60x0d2500x0d5200x0dd450x0b5a00x056d00x055b2,  
  43.             0x049b00x0a5770x0a4b00x0aa500x1b2550x06d200x0ada0 };  
  44.  
  45.     // ====== 传回农历 y年的总天数  
  46.     final private static int yearDays(int y) {  
  47.         int i, sum = 348;  
  48.         for (i = 0x8000; i > 0x8; i >>= 1) {  
  49.             if ((lunarInfo[y - 1900] & i) != 0)  
  50.                 sum += 1;  
  51.         }  
  52.         return (sum + leapDays(y));  
  53.     }  
  54.  
  55.     // ====== 传回农历 y年闰月的天数  
  56.     final private static int leapDays(int y) {  
  57.         if (leapMonth(y) != 0) {  
  58.             if ((lunarInfo[y - 1900] & 0x10000) != 0)  
  59.                 return 30;  
  60.             else 
  61.                 return 29;  
  62.         } else 
  63.             return 0;  
  64.     }  
  65.  
  66.     // ====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0  
  67.     final private static int leapMonth(int y) {  
  68.         return (int) (lunarInfo[y - 1900] & 0xf);  
  69.     }  
  70.  
  71.     // ====== 传回农历 y年m月的总天数  
  72.     final private static int monthDays(int y, int m) {  
  73.         if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)  
  74.             return 29;  
  75.         else 
  76.             return 30;  
  77.     }  
  78.  
  79.     // ====== 传回农历 y年的生肖  
  80.     final public String animalsYear() {  
  81.         final String[] Animals = new String[] { "鼠""牛""虎""兔""龙""蛇",  
  82.                 "马""羊""猴""鸡""狗""猪" };  
  83.         return Animals[(year - 4) % 12];  
  84.     }  
  85.  
  86.     // ====== 传入 月日的offset 传回干支, 0=甲子  
  87.     final private static String cyclicalm(int num) {  
  88.         final String[] Gan = new String[] { "甲""乙""丙""丁""戊""己""庚",  
  89.                 "辛""壬""癸" };  
  90.         final String[] Zhi = new String[] { "子""丑""寅""卯""辰""巳""午",  
  91.                 "未""申""酉""戌""亥" };  
  92.         return (Gan[num % 10] + Zhi[num % 12]);  
  93.     }  
  94.  
  95.     // ====== 传入 offset 传回干支, 0=甲子  
  96.     final public String cyclical() {  
  97.         int num = year - 1900 + 36;  
  98.         return (cyclicalm(num));  
  99.     }  
  100.  
  101.     public Lunar() {  
  102.     }  
  103.  
  104.     /** */ 
  105.     /**  
  106.      * 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数 ? monCyl4:从1900年1月31日以来,闰月数  
  107.      * dayCyl5:与1900年1月31日相差的天数,再加40 ?  
  108.      *   
  109.      * @param cal  
  110.      * @return  
  111.      */ 
  112.     public Lunar(Calendar cal) {  
  113.         @SuppressWarnings("unused")  
  114.         int yearCyl, monCyl, dayCyl;  
  115.         int leapMonth = 0;  
  116.         Date baseDate = null;  
  117.         try {  
  118.             baseDate = chineseDateFormat.parse("1900年1月31日");  
  119.         } catch (ParseException e) {  
  120.             e.printStackTrace(); // To change body of catch statement use  
  121.                                     // Options | File Templates.  
  122.         }  
  123.  
  124.         // 求出和1900年1月31日相差的天数  
  125.         int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);  
  126.         dayCyl = offset + 40;  
  127.         monCyl = 14;  
  128.  
  129.         // 用offset减去每农历年的天数  
  130.         // 计算当天是农历第几天  
  131.         // i最终结果是农历的年份  
  132.         // offset是当年的第几天  
  133.         int iYear, daysOfYear = 0;  
  134.         for (iYear = 1900; iYear < 2050 && offset > 0; iYear++) {  
  135.             daysOfYear = yearDays(iYear);  
  136.             offset -= daysOfYear;  
  137.             monCyl += 12;  
  138.         }  
  139.         if (offset < 0) {  
  140.             offset += daysOfYear;  
  141.             iYear--;  
  142.             monCyl -= 12;  
  143.         }  
  144.         // 农历年份  
  145.         year = iYear;  
  146.  
  147.         yearCyl = iYear - 1864;  
  148.         leapMonth = leapMonth(iYear); // 闰哪个月,1-12  
  149.         leap = false;  
  150.  
  151.         // 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天  
  152.         int iMonth, daysOfMonth = 0;  
  153.         for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {  
  154.             // 闰月  
  155.             if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap) {  
  156.                 --iMonth;  
  157.                 leap = true;  
  158.                 daysOfMonth = leapDays(year);  
  159.             } else 
  160.                 daysOfMonth = monthDays(year, iMonth);  
  161.  
  162.             offset -= daysOfMonth;  
  163.             // 解除闰月  
  164.             if (leap && iMonth == (leapMonth + 1))  
  165.                 leap = false;  
  166.             if (!leap)  
  167.                 monCyl++;  
  168.         }  
  169.         // offset为0时,并且刚才计算的月份是闰月,要校正  
  170.         if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {  
  171.             if (leap) {  
  172.                 leap = false;  
  173.             } else {  
  174.                 leap = true;  
  175.                 --iMonth;  
  176.                 --monCyl;  
  177.             }  
  178.         }  
  179.         // offset小于0时,也要校正  
  180.         if (offset < 0) {  
  181.             offset += daysOfMonth;  
  182.             --iMonth;  
  183.             --monCyl;  
  184.         }  
  185.         month = iMonth;  
  186.         day = offset + 1;  
  187.     }  
  188.  
  189.     public static String getChinaDayString(int day) {  
  190.         String chineseTen[] = { "初""十""廿""卅" };  
  191.         int n = day % 10 == 0 ? 9 : day % 10 - 1;  
  192.         if (day > 30)  
  193.             return "";  
  194.         if (day == 10)  
  195.             return "初十";  
  196.         else 
  197.             return chineseTen[day / 10] + chineseNumber[n];  
  198.     }  
  199.  
  200.     public String toString() {  
  201.         Log.d("debug""1111");  
  202.         return (leap ? "闰" : "") + chineseNumber[month - 1] + "月" 
  203.                 + getChinaDayString(day);  
  204.     }  
  205.  
  206.     /**  
  207.      * 此方法返回阴历  
  208.      *   
  209.      * @param 阳历日期  
  210.      *            2003年1月1日  
  211.      */ 
  212.     public String getLunar(String date) throws ParseException {  
  213.         Calendar today = Calendar.getInstance();  
  214.         today.setTime(chineseDateFormat.parse(date));  
  215.         Lunar lunar = new Lunar(today);  
  216.         return lunar.toString();  
  217.     }  

 

你可能感兴趣的:(java,阳历转阴历)