⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lunarcal.java

📁 java开发的一个备忘录 很好用的 可以记下你什么时候要做什么 什么时候做过什么
💻 JAVA
字号:
import   java.text.ParseException;   
import   java.text.SimpleDateFormat;   
import   java.util.Calendar;   
import   java.util.Date;   
import   java.util.HashMap;
    
  public   class   LunarCal   {   
  
      HashMap   hashmap   =   new   HashMap();//用来记录的键值对 
      
         String   lunarDate="";
                
          private static   int   year;   
          private   int   month;   
          private   int   day;   
          private   boolean   leap;   
          //final   static   String   chineseNumber[]   =   {"一",   "二",   "三",   "四",   "五",   "六",   "七",   "八",   "九",   "十",   "十一",   "十二"};   
          
          int   monthlyDate[]   =   new   int[]   {   31,   28,   31,   30,   31,   30,   31,   31,   30,   31,   30, 31   }; 

      public   boolean   isLeapYear(int   year)   {   
          boolean   flag   =   false;   
          if   ( ( (year   %   4   ==   0)   &&   (year   %   100   !=   0) )  ||   (year   %   400   ==   0))   {   
              flag   =   true;   
          }   
          return   flag;   
      } 
                
          static   SimpleDateFormat   chineseDateFormat   =   new   SimpleDateFormat("yyyy-MM-dd");   
          
          final   static   long[]   lunarInfo   =   new   long[]   
          {0x04bd8,   0x04ae0,   0x0a570,   0x054d5,   0x0d260,   0x0d950,   0x16554,   0x056a0,   0x09ad0,   0x055d2,   
            0x04ae0,   0x0a5b6,   0x0a4d0,   0x0d250,   0x1d255,   0x0b540,   0x0d6a0,   0x0ada2,   0x095b0,   0x14977,   
            0x04970,   0x0a4b0,   0x0b4b5,   0x06a50,   0x06d40,   0x1ab54,   0x02b60,   0x09570,   0x052f2,   0x04970,   
            0x06566,   0x0d4a0,   0x0ea50,   0x06e95,   0x05ad0,   0x02b60,   0x186e3,   0x092e0,   0x1c8d7,   0x0c950,   
            0x0d4a0,   0x1d8a6,   0x0b550,   0x056a0,   0x1a5b4,   0x025d0,   0x092d0,   0x0d2b2,   0x0a950,   0x0b557,   
            0x06ca0,   0x0b550,   0x15355,   0x04da0,   0x0a5d0,   0x14573,   0x052d0,   0x0a9a8,   0x0e950,   0x06aa0,   
            0x0aea6,   0x0ab50,   0x04b60,   0x0aae4,   0x0a570,   0x05260,   0x0f263,   0x0d950,   0x05b57,   0x056a0,   
            0x096d0,   0x04dd5,   0x04ad0,   0x0a4d0,   0x0d4d4,   0x0d250,   0x0d558,   0x0b540,   0x0b5a0,   0x195a6,   
            0x095b0,   0x049b0,   0x0a974,   0x0a4b0,   0x0b27a,   0x06a50,   0x06d40,   0x0af46,   0x0ab60,   0x09570,   
            0x04af5,   0x04970,   0x064b0,   0x074a3,   0x0ea50,   0x06b58,   0x055c0,   0x0ab60,   0x096d5,   0x092e0,   
            0x0c960,   0x0d954,   0x0d4a0,   0x0da50,   0x07552,   0x056a0,   0x0abb7,   0x025d0,   0x092d0,   0x0cab5,   
            0x0a950,   0x0b4a0,   0x0baa4,   0x0ad50,   0x055d9,   0x04ba0,   0x0a5b0,   0x15176,   0x052b0,   0x0a930,   
            0x07954,   0x06aa0,   0x0ad50,   0x05b52,   0x04b60,   0x0a6e6,   0x0a4e0,   0x0d260,   0x0ea65,   0x0d530,   
            0x05aa0,   0x076a3,   0x096d0,   0x04bd7,   0x04ad0,   0x0a4d0,   0x1d0b6,   0x0d250,   0x0d520,   0x0dd45,   
            0x0b5a0,   0x056d0,   0x055b2,   0x049b0,   0x0a577,   0x0a4b0,   0x0aa50,   0x1b255,   0x06d20,   0x0ada0};   
    
          //======   传回农历   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   cyclicaly()   {   
                  int   num   =   year   -   1900   +   36;   
                  return   (cyclicalm(num));   
          }   
          
          final public String cyclicalm(){
			  int num= (year-1900) * 12 + month + 13;
				  return(cyclicalm(num));
			  }
          
          final public String cyclicald(long m,int n){
			  int num=(int)(m/86400000+25567+10);
			  return (cyclicalm(num+n));
		  }

          public void hashGen(int y) throws   ParseException
          {
           if   (isLeapYear(y)==true)   { 
             
              monthlyDate[1]   =   29;   
           }
           
           for   (int   i   =   1;   i   <=   12;   i++)   {   
              for   (int   j   =   1;   j   <=   monthlyDate[i   -   1];   j++)   {  
               
                Calendar   today   =   Calendar.getInstance();   
                String ymd=String.valueOf(y)+"-"+String.valueOf(i)+"-"+String.valueOf(j);
                
                today.setTime(chineseDateFormat.parse(ymd));
               sun2Lunar(today);
               
               String nularYmd=String.valueOf(year)+"-"+String.valueOf(month)+"-"+String.valueOf(day);
               
               
               put(nularYmd,ymd);
               
              
              }
            }
            
   //阴历的日期每年都比阳历晚一些,所以要把查询时的阳历下一年的前3个月加上
   
   y=y+1;
           if   (isLeapYear(y)==true)   { 
             
              monthlyDate[1]   =   29;   
           }
           
           for   (int   i   =   1;   i   <=   3;   i++)   {   
              for   (int   j   =   1;   j   <=   monthlyDate[i   -   1];   j++)   {  
               
                Calendar   today   =   Calendar.getInstance();   
                String ymd=String.valueOf(y)+"-"+String.valueOf(i)+"-"+String.valueOf(j);
                
                today.setTime(chineseDateFormat.parse(ymd));
               sun2Lunar(today);
               
               String nularYmd=String.valueOf(year)+"-"+String.valueOf(month)+"-"+String.valueOf(day);
               
               
               put(nularYmd,ymd);
               
              
              }
            }

               
          }
    
          /**   
            *   传出y年m月d日对应的农历
            *   yearCyl3:农历年与1864的相差数
            *   monCyl4:从1900年1月31日以来,闰月数
            *   dayCyl5:与1900年1月31日相差的天数,再加40
            *   @param   cal
            *   @return     
            */   
            
          public void sun2Lunar(Calendar   cal){
            
                              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 LunarCal(Calendar   cal)   {   
           
           sun2Lunar(cal);

          }   
          
          public LunarCal(int y, int m, int d)  throws   ParseException { 
           
           hashGen(y);
           
           lunarDate=String.valueOf(y)+"-"+String.valueOf(m)+"-"+String.valueOf(d);
          
          }
   
          
        
       public   void   put(String   key,   String   value)   {   
           if   (!hashmap.containsKey(key)   &&   !hashmap.containsValue(value))   {   
               hashmap.put(key, value);   
            }     
          }
 
       public   String   getSun()   {   
           if   (lunarDate   ==   null   ||   lunarDate.trim().equals(""))   
               return   "";   
           return   (String)   hashmap.get(lunarDate);
           
       }                    

          public   String   getLunar()   {   
                  return   year  +"-"  +  month    +  "-"   +   day;   
          }
                 
         
  } 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -