• Zenoven转:较为综合的阴历阳历JAVA源程序

    /************************************
     阴历及节日程序 2008 beta1
     免费软件(Free Software) 你可以无限传播与反编译
     该日历有三种外观样式,有从1900年至2049年间的所有阴历
     个人爱好开发  作者:朱春 Email:npuxbd@163.com
     Copyright @ 2008- All Rights Reserved
     FileName:Simple_Calendar
     **********************************/
    import java.text.*;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import javax.swing.border.*;
    import java.util.*;
    import javax.swing.*;
    public class Simple_Calendar extends JFrame implements ActionListener{

     

     public static void main(String[] args) {
      
      SwingConsole.run(new Simple_Calendar(),525,525);
     }

     

     public Simple_Calendar() {
      setTitle(” 阴历及节日软件 2008 beta1″);
      setIconImage(this.getToolkit().createImage(“title.gif”));
      setResizable(false);
      calendar = Calendar.getInstance();
      today = calendar.get(Calendar.DAY_OF_MONTH);
      panel_Header=initializtion_Header();
      panel_Week =initializtion_Week();
      panel_Calendar=initializtion_Calendar();
       setLayout(null);
      setBounds(185,125,0,0);
      add(panel_Header);panel_Calendar.setBounds(0 ,0  ,525 , 45);
      add(panel_Week);     panel_Week.setBounds(0 ,45 ,525 , 35);
         add(panel_Calendar);panel_Calendar.setBounds(0 ,80 ,525 , 415) ;
         initializtion_Data(calendar);
        
      
      
     }
        private  JPanel initializtion_Header(){//显示表头的panel
          
         JPanel panel = new JPanel();
         year_box  = new  JComboBox();
         month_box = new JComboBox();
         cross=new JRadioButton(“c”,false);cross.addActionListener(new LookAndFeel_Listener());
         system=new JRadioButton(“s”,false);system.addActionListener(new LookAndFeel_Listener());
         motif=new JRadioButton(“m”,false);motif.addActionListener(new LookAndFeel_Listener());
         feel_group= new ButtonGroup();
         show_help = new JButton(“说 明”);
         
         show_help.addActionListener(new Statement_Listener());
         
         feel_group.add(cross);feel_group.add(system);feel_group.add(motif);
         panel.setBorder(new EtchedBorder(5,Color.red,Color.BLUE));
         JLabel year_l = new JLabel(“请您选择年份: “,JLabel.RIGHT);
         JLabel month_l = new JLabel(“月份: “,JLabel.RIGHT);
         panel.setLayout(null);
         panel.setSize(525,45);
     

     

         for(int i = 1900 ;i < 2050 ; i++)
            year_box.addItem(“”+i);
         for(int j = 1 ; j <= 12 ;j++)
            month_box.addItem(“”+j) ;
       
         year_box.setSelectedIndex(calendar.get(Calendar.YEAR)-1900);
         month_box.setSelectedIndex(calendar.get(Calendar.MONTH));
         panel.add(year_l);      year_l.setBounds(0,10,95,25);
         panel.add(year_box);  year_box.setBounds(100,10,65,25);
         panel.add(month_l);    month_l.setBounds(160,10,45,25);
         panel.add(month_box);month_box.setBounds(210,10,45,25);
         JLabel look_feel = new JLabel(“外观:”,JLabel.RIGHT);
         panel.add(look_feel);look_feel.setBounds(290-38,10,38,25);
         panel.add(cross);       cross.setBounds(290,10,38,25);
         panel.add(system);     system.setBounds(325,10,32,25);
         panel.add(motif);       motif.setBounds(355,10,38,25);
         panel.add(show_help);  show_help.setBounds(400,10,65,25);
         show_help.setBorder(new EmptyBorder(0,0,0,0));
         show_help.setBackground(Color.getHSBColor(23,21,10));
         year_box.addActionListener(this);
         month_box.addActionListener(this);
         return panel;
        }
        private JPanel initializtion_Week(){//显示星期的panel
      JPanel panel = new JPanel();
      
      panel.setLayout(new GridLayout(1,7));
      
      String columnNames[]={“星期日”,”星期一”,”星期二”,”星期三”,
                                      “星期四”,”星期五”,”星期六”};
            JLabel label =null;
            for(int i=0;i<7;i++){
             label = new JLabel(columnNames[i],JLabel.CENTER);
             if(i == 0 || i == 6)
               label.setForeground(Color.RED);
             label.setBorder(new LineBorder(Color.BLUE));
             panel.add(label);
            }
            return panel;
     }
        private JPanel initializtion_Calendar(){//显示日期的panel
            JPanel panel = new JPanel();
         
            panel.setLayout(new GridLayout(6,7));
            for( int i = 0 ; i < 6 ; i++ ){
              for(int j = 0 ; j < 7 ; j++ ){
             label=new JLabel(“”,JLabel.CENTER);
             
             datas[i][j] = label;
             label.setBorder(new LineBorder(Color.BLUE));
             if(j==0 || j==6)
                label.setForeground(Color.RED); 
             datas[i][j].addMouseListener(new List_MouseListener());
             panel.add(label);
            }
         }
         return panel;
        }
       
        public  void clear_Data(){//清空内容的
         for(int i = 0 ; i < 6 ; i++ )
          for(int j = 0 ; j < 7 ; j++ ){
           datas[i][j].setText(“”);
           if(j==0 || j==6)
              datas[i][j].setForeground(Color.RED);
           else
              datas[i][j].setForeground(null);
          }
             
        }
        public  void initializtion_Data(Calendar calendar){//初始化函数
       ////////////////////////////////////////////////////
       ////////////////////////////////////////////////////////////
        /* 节日和纪念日
    格式:起始年(yyyy)+月(mm)+日(dd)

     

    0000表示起始年不明*/
    HashMap<String,String>  sFestival =new  HashMap<String,String>();
    //String []sFestival_={
    sFestival.put(“0101″,”  元旦”);
    sFestival.put(“0214″,”情人节”);
    sFestival.put(“0308″,”妇女节”);
    sFestival.put(“0312″,”植树节”);
    sFestival.put(“0401″,”愚人节”);
    sFestival.put(“0501″,”劳动节”);
    sFestival.put(“0504″,”青年节”);
    sFestival.put(“0601″,”儿童节”);
    sFestival.put(“0701″,”建党节”);
    sFestival.put(“0801″,”建军节”);
    sFestival.put(“0910″,”教师节”);
    sFestival.put(“1001″,”国庆节”);
    sFestival.put(“1031″,”万圣节”);
    sFestival.put(“1112″,”孙中山诞辰”);
    sFestival.put(“1225″,”圣诞节”);
    sFestival.put(“1226″,”毛泽东诞辰”);
    //};
    //某月第几个星期几
    //起始年(4位)+月(2位)+第几个(1位)+星期几(1位)
    HashMap<String,String>  wFestival =new  HashMap<String,String>();
    //String []wFestival={
    wFestival.put(“0520″,”母亲节”);
    wFestival.put(“0630″,”父亲节”);
    wFestival.put(“1144″,”感恩节”);
    //};
    //农历 99表示月最后一天
    HashMap<String,String>  lFestival =new  HashMap<String,String>();
    //String []lFestival={
    lFestival.put(“0101″,”春 节”);
    lFestival.put(“0102″,”大年初二”);
    lFestival.put(“0103″,”大年初三”);
    lFestival.put(“0115″,”元宵节”);
    lFestival.put(“0505″,”端午节”);
    lFestival.put(“0707″,”七 夕”);
    lFestival.put(“0815″,”中秋节”);
    lFestival.put(“0909″,”重阳节”);
    lFestival.put(“1208″,”腊八节”);
    lFestival.put(“1299″,”除 夕”);
    //};
       
    /////////////////////////////////////////////////////////////
       
       //////////////////////////////////////////////////// 
          this.calendar = calendar;
          today = calendar.get(Calendar.DAY_OF_MONTH);
          int month = calendar.get(Calendar.MONTH);
          int weekindexDay;
       int weekindexMonth;
      
       calendar.set(Calendar.DATE,1);
      
      while(calendar.get(Calendar.MONTH)==month)
      {   weekindexMonth=calendar.get(Calendar.WEEK_OF_MONTH)-1;
          weekindexDay=calendar.get(Calendar.DAY_OF_WEEK)-1;
          int day=calendar.get(Calendar.DAY_OF_MONTH);
          ///////////////////////////////////////////////
          String today_,month_;
          today_ =day < 10?  “0” + day:”” + day;
          month_ =month<10?  “0” +(month+1):””+(month+1);
          Lunar lunar = new Lunar(calendar);
          String lunar_= lunar.toString();
          ///////////////////////////////////////////
          if( null != sFestival.get(month_+today_))
               lunar_=”<font color=red>”+sFestival.get(month_+today_);
          ///////
          String wFestival_=month_+(weekindexMonth)+(weekindexDay);
         
          if( null != wFestival.get(wFestival_)){
           lunar_=”<font color=red>”+wFestival.get(wFestival_);
           System.out.println(wFestival_);
          }
             
         
         
         
          if( null != lFestival.get(lunar.numeric_md()))
              lunar_=”<font color=red>”+lFestival.get(lunar.numeric_md());
         
         
             
          //计算除夕
          Calendar temp_calendar = Calendar.getInstance();
          temp_calendar.set(calendar.get(Calendar.YEAR),month,day+1);
         
          //temp_calendar.add(Calendar.DAY_OF_MONTH,1);
          Lunar temp_lunar = new Lunar(temp_calendar);
          String temp_str = temp_lunar.numeric_md();
           if(temp_str.equals(“0101”))
              lunar_=”<font color=red>”+lFestival.get(“1299”);
          ///计算除夕结束
          //////////////////////////////////////////
          String day_str;
          if(day<10) day_str=”<html><center><font size=6>”+today_;
          else       day_str=”<html><center><font size=6>”+today_;
         
          day_str+=”</font><br>”+lunar_;
       
          if(day==today)
             datas[weekindexMonth][weekindexDay].setForeground(Color.GREEN);
          datas[weekindexMonth][weekindexDay].setText(day_str);
          calendar.add(Calendar.DATE,1);
      } 
         
         
         
     /////////////////////////////////////////////////    
        }
        public  void actionPerformed(ActionEvent e){//日期和年份的选择更新
         int year = Integer.parseInt(year_box.getSelectedItem().toString()) ;
         int month= Integer.parseInt(month_box.getSelectedItem().toString())-1 ;
         calendar.set(year,month,today);
         clear_Data();
            initializtion_Data(calendar);
        }
        class LookAndFeel_Listener implements ActionListener{//选择外观的样式
     public void actionPerformed(ActionEvent ev){
      JRadioButton o = (JRadioButton)ev.getSource();
      String str=o.getText();
      if(“c” == str){
       try {UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
                } catch(Exception e) { e.printStackTrace(); }
      }else if(“s” == str){
       try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                 } catch(Exception e) {e.printStackTrace();}
      }else if(“m” == str){
       try{UIManager.setLookAndFeel(“com.sun.java.swing.plaf.motif.MotifLookAndFeel”);}
                catch(Exception e) {e.printStackTrace(); }
      }
      SwingUtilities.updateComponentTreeUI(Simple_Calendar.this);
       }
     
        }
        class Statement_Listener implements ActionListener{//显示声明信息
         JDialog dialog=null;
         public void actionPerformed(ActionEvent ev){
            String statment = “<html>阴历及节日程序 2008 beta1″;
             statment +=”<br>免费软件(Free Software) 你可以无限传播与反编译.”;
             statment +=”<br>该日历有三种外观样式,有从1900年至2049年间的所有阴历.”;
             statment +=”<br>个人爱好开发  作者:朱春 Email:npuxbd@163.com”;
             statment +=”<br>Copyright @ 2008- All Rights Reserved”;
            dialog=new  JDialog(Simple_Calendar.this, “阴历及节日软件 2008 beta1”,true);
                  dialog.setLayout(null);
                  dialog.setBounds(285,215,365,185);
                  JLabel label_s = new JLabel(statment);//label_s.setBackground(Color.RED);
                  JButton button=new JButton(“确 定”);
                  button.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent evet){
                      dialog.setVisible(false);
                   }
                  });
                  dialog.add(label_s);label_s.setBounds(20,0,365,100);
                  dialog.add(button);  button.setBounds(145,110,65,25);
                  dialog.setVisible(true);
           }
         
        }
        class List_MouseListener implements MouseListener{//鼠标移入时显示的信息
         JLabel labe=null;
         String weeks[]={“星期日”,”星期一”,”星期二”,”星期三”,
                                      “星期四”,”星期五”,”星期六”};
                                     

     

            public String constellation(Calendar cal){
      
                    String [][]con ={
                         {“水瓶座”,”0122″,”0221″},
                         {“双鱼座”,”0222″,”0321″},
                         {“白羊座”,”0322″,”0420″},
                         {“金牛座”,”0421″,”0521″},
                         {“双子座”,”0522″,”0621″},
                         {“巨蟹座”,”0621″,”0721″},
                         {“狮子座”,”0722″,”0821″},
                         {“处女座”,”0822″,”0921″}, 
                         {“天秤座”,”0922″,”1021″},
                         {“天蝎座”,”1022″,”1121″},
                         {“射手座”,”1122″,”1221″},
                         {“摩羯座”,”1222″,”0121″}};
                    int month=cal.get(Calendar.MONTH)+1;
                    int today=cal.get(Calendar.DAY_OF_MONTH);
                    String month_str=month<10?”0″+month:””+month;
                    String today_str=today<10?”0″+today:””+today;
                    String str=month_str+today_str;
                    for( int i = 0 ; i < con.length-1 ; i++ )
                    {
                         if(Integer.parseInt(str) >= Integer.parseInt(con[i][1]) && Integer.parseInt(str) <= Integer.parseInt(con[i][2]))
                            return con[i][0]; 
                     
                    }
                    if((Integer.parseInt(str) >= Integer.parseInt(con[11][1]) && Integer.parseInt(str) < 1232) ||  Integer.parseInt(str) <=Integer.parseInt( con[11][2]) )
                       return  con[11][0];
           
                   return “error!”;
            }
           
         public void mouseClicked(MouseEvent e) {//鼠标按键在组件上单击(按下并释放)时调用。
            
            }    
            public void mouseEntered(MouseEvent e) {//鼠标进入到组件上时调用。
                 labe=(JLabel)e.getSource();
                 String lab =labe.getText();
                 if(lab != “”){
                  labe.setBackground(Color.red);
                  String day=lab.substring(lab.indexOf(“size=6>”)+7,lab.indexOf(“</font>”));
                    //String lun=lab.substring(lab.indexOf(“<br>”)+4);
                    String message = “<html><body><center>公元 “+year_box.getSelectedItem()+”年”+
                                     month_box.getSelectedItem()+”月”+Integer.parseInt(day)+”日”;
                    calendar.set(Integer.parseInt(year_box.getSelectedItem().toString()),
                                 Integer.parseInt(month_box.getSelectedItem().toString())-1,
                                 Integer.parseInt(day));
                    Lunar lunar=new Lunar(calendar);
                    message+=”<br><font color=red>”+weeks[(calendar.get(calendar.DAY_OF_WEEK)-1)];
                    message+=”&nbsp;&nbsp;&nbsp;&nbsp;”+constellation(calendar)+”</font><br>农历 “;
                    message+=lunar.get_month()+”月”+lunar.get_Big_Or_Small()+”&nbsp;&nbsp;&nbsp;&nbsp;”+lunar.get_date()+”日”;
                    //message+=lunar.get_JQ();
                    labe.setToolTipText(message);
                    labe.setBackground(Color.BLUE);
                    labe.setOpaque(true);
                   // System.out.println(day+”:”+lun);
                 }
                
            } 
            public void mouseExited(MouseEvent e) {//  鼠标离开组件时调用。
                      
            
                            labe.setBackground(null);
                            labe.setOpaque(true);
            }
            public void mousePressed(MouseEvent e) {//  鼠标按键在组件上按下时调用。
           
            }
            public void mouseReleased(MouseEvent e) {//  鼠标按钮在组件上释放时调用。
            }

     

        }
        /////////////////////////////////////////////////////////
        private JLabel datas[][]=new JLabel[6][7];//显示一月的日期
        private JLabel temp_label=null;
        private  JLabel label=null;
        private JPanel panel_Header,panel_Week,panel_Calendar;
        private Calendar calendar=null;
        private  JComboBox  year_box = null ;
        private  JComboBox month_box = null ;
        private int today ;
        private JRadioButton cross=null,system=null,motif=null;
        private ButtonGroup feel_group=null;
        private JButton show_help =null;
       
         
    }

     

     

     

    /*
     *以下是阴历对象;
     * 是从网络中得来的;
     */
      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 []
         { 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 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 ];
        }
       
       
    }
      class SwingConsole {//提供安全线程机制
     public static void run(final JFrame f,final int width,final int height){
      SwingUtilities.invokeLater(new Runnable(){
       public void run(){
       
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(width,height);
        f.setVisible(true);
       }
      });
     }
    }