java 农历计算方式

本文介绍了一个用于农历转换和计算的Java程序,包括农历年、月、日的转换、生肖计算、干支纪年等,提供了丰富的API接口进行农历日期的查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package my.ertpassword;


import java.io.*;
import java.util.*;
public class NongLi
{
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};
final public static int lYearDays(int y)//====== 传回农历 y年的总天数
{
         int i,sum = 348;
         for(i=0x8000; i>0x8; i>>=1)
         {
                 if ((lunarInfo[y-1900] & i)!=0) sum+=1;
         }
         return(sum+leapDays(y));
}
final public static int leapDays(int y)//====== 传回农历 y年闰月的天数
{
         if(leapMonth(y)!=0)
         {
                 if ((lunarInfo[y-1900] & 0x10000)!=0) return 30;
                 else return 29;
         }
         else   return 0;
}
final public static int leapMonth(int y)//====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
{
         return (int)(lunarInfo[y-1900] & 0xf);
}

final public static int monthDays(int y,int m)//====== 传回农历 y年m月的总天数
{
         if ((lunarInfo[y-1900] & (0x10000>>m))==0) return 29;
         else return 30;
}
final public static String AnimalsYear(int y)//====== 传回农历 y年的生肖
{
         final String[] Animals=new String[] {"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};
         return Animals[(y-4)];
}
final public static String cyclicalm(int num)//====== 传入 月日的offset 传回干支, 0=甲子
{
         final String[] Gan=new String[] {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
         final String[] Zhi=new String[] {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
         return (Gan[num]+Zhi[num]);
}
final public static String cyclical(int y)//====== 传入 offset 传回干支, 0=甲子
{
         int num=y-1900+36;
         return (cyclicalm(num));
}
final public long[] Lunar(int y,int m)//传出农历.year0 .month1 .day2 .yearCyl3 .monCyl4
                                         //        .dayCyl5 .isLeap6
{
         final int[] year20=new int[]{1,4,1,2,1,2,1,1,2,1,2,1};
         final int[] year19=new int[]{0,3,0,1,0,1,0,0,1,0,1,0};
         final int[] year2000=new int[]{0,3,1,2,1,2,1,1,2,1,2,1};
         long[] nongDate = new long[7];
         int i=0,temp=0,leap=0;
         Date baseDate =new Date(1900,1,31);
         Date objDate   =new Date(y,m,1);
         long offset = (objDate.getTime()-baseDate.getTime())/86400000L;
         if (y<2000) offset+=year19[m-1];
         if (y>2000) offset+=year20[m-1];
         if (y==2000) offset+=year2000[m-1];
         nongDate[5] = offset + 40;
         nongDate[4] = 14;
         for(i=1900; i<2050 && offset>0; i++) {
                 temp = lYearDays(i);
                 offset -= temp;
                 nongDate[4] += 12;
         }
         if(offset<0) {
                 offset += temp;
                 i--;
                 nongDate[4] -= 12;
         }
         nongDate[0] = i;
         nongDate[3] = i-1864;
         leap = leapMonth(i); //闰哪个月
         nongDate[6] = 0;
         for(i=1; i<13 && offset>0; i++) {
                 //闰月
                 if(leap>0 && i==(leap+1) && nongDate[6]==0)
                 { --i; nongDate[6] = 1; temp = leapDays((int) nongDate[0]); }
                 else
                 { temp = monthDays((int) nongDate[0],i); }
                 //解除闰月
                 if(nongDate[6]==1 && i==(leap+1)) nongDate[6] = 0;
                 offset -= temp;
                 if(nongDate[6] == 0) nongDate[4] ++;
         }
         if(offset==0 && leap>0 && i==leap+1){
                 if(nongDate[6]==1)
                 { nongDate[6] = 0; }
                 else
                 { nongDate[6] = 1; --i; --nongDate[4];}
         }
         if(offset<0){ offset += temp; --i; --nongDate[4]; }
         nongDate[1] = i;
         nongDate[2] = offset + 1;
         return nongDate;
}

final public static long[] calElement(int y,int m,int d)
//传出y年m月d日对应的农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
{
         long[] nongDate = new long[7];
         int i=0,temp=0,leap=0;
         Date baseDate = new Date(0,0,31);
         Date objDate   = new Date(y-1900,m-1,d);
         long offset = (objDate.getTime()-baseDate.getTime())/86400000L;
         nongDate[5] = offset + 40;
         nongDate[4] = 14;
         for(i=1900; i<2050 && offset>0; i++) {
                 temp = lYearDays(i);
                 offset -= temp;
                 nongDate[4] += 12;
         }
         if(offset<0) {
                 offset += temp;
                 i--;
                 nongDate[4] -= 12;
         }
         nongDate[0] = i;
         nongDate[3] = i-1864;
         leap = leapMonth(i); //闰哪个月
         nongDate[6] = 0;
         for(i=1; i<13 && offset>0; i++) {
                 //闰月
                 if(leap>0 && i==(leap+1) && nongDate[6]==0)
                 { --i; nongDate[6] = 1; temp = leapDays((int)nongDate[0]); }
                 else
                 { temp = monthDays((int)nongDate[0],i); }
                 //解除闰月
                 if(nongDate[6]==1 && i==(leap+1)) nongDate[6] = 0;
                 offset -= temp;
                 if(nongDate[6] == 0) nongDate[4] ++;
         }
         if(offset==0 && leap>0 && i==leap+1){
                 if(nongDate[6]==1)
                 { nongDate[6] = 0; }
                 else
                 { nongDate[6] = 1; --i; --nongDate[4];}
         }
         if(offset<0){ offset += temp; --i; --nongDate[4]; }
         nongDate[1] = i;
         nongDate[2] = offset + 1;
         return nongDate;
}
   public static String getchina(int day){
     String a = "";
     if(day==10)
       return "10";
     int two = (int)((day)/10);
     if(two==0)
       a = "0";
     if(two==1)
       a = "1";
     if(two==2)
       a = "2";
     if(two==3)
       a = "3";
     int one = (int)(day);
     switch(one){
       case 1:a += "1";break;
       case 2:a += "2";break;
       case 3:a += "3";break;
       case 4:a += "4";break;
       case 5:a += "5";break;
       case 6:a += "6";break;
       case 7:a += "7";break;
       case 8:a += "8";break;
       case 9:a += "9";break;
     }
     return a;
   }
//传出y年m月d日对应的农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
   public static String er(String date){
    Calendar cld = Calendar.getInstance();
      int year =Integer.parseInt(date.substring(0, 4));
      int month = Integer.parseInt(date.substring(5, 7));
      int day =  Integer.parseInt(date.substring(8, 10));
      String week = "";
      long[] l = calElement(year,month,day);
      switch(cld.get(Calendar.DAY_OF_WEEK)){
        case 1:week = "日";break;
        case 2:week = "一";break;
        case 3:week = "二";break;
        case 4:week = "三";break;
        case 5:week = "四";break;
        case 6:week = "五";break;
        case 7:week = "六";break;
      }
      String n = "";
      switch((int)(l[1])){
        case 1:n="1";break;
        case 2:n="2";break;
        case 3:n="3";break;
        case 4:n="4";break;
        case 5:n="5";break;
        case 6:n="6";break;
        case 7:n="7";break;
        case 8:n="8";break;
        case 9:n="9";break;
        case 10:n="10";break;
        case 11:n="11";break;
        case 12:n="12";break;
      }
      String a="";
      try {
        //String a = "北京时间: "+year+"-"+month+"-"+day+"日            星期"+week+" 农历"+year+"-"+n+"-"+getchina((int)(l[2]));
        //String b = "北京时间: "+year+"-"+month+"-"+day+"日 星期"+week+" 农历"+n+"月"+getchina((int)(l[2]));
       if(Integer.parseInt(n)<10){
        n="0"+n;
       }
       a = year+"-"+n+"-"+getchina((int)(l[2]));
      } catch (Exception e)     {e.printStackTrace();}
  return a;
    }
}
//调用方法 NongLi.er(date);

LunarCalendar返回农历(阴历)日期的JAR包 根据指定日期计算对应农历日期(这个计算方法是网上找的,最初的作者是谁已经无法考证了,感谢网络资源吧!),本人封装成好用的JAR包后发不出来,供大家免费下载! toString()方法输出阴历日期(例如:癸巳年七月廿) getFullInfo()方法输出包括生肖在内的阴历日期(例如:癸巳年七月廿,生肖:蛇) 构建方法包括以下四种: public LunarCalendar(String year, String month, String date) public LunarCalendar(JComboBox jcYear, JComboBox jcMonth, JComboBox jcDate) public LunarCalendar(int year, int month, int date) public LunarCalendar(Calendar cal)) 使用前两种构建方法时,若文本内容不为数字,getErrorMessage会返回错误信息 方法摘要 java.lang.String getErrorMessage() 返回String类型的错误信息 java.lang.String getFullInfo() 返回String类型的详细阴历信息(例如:癸巳年七月廿,生肖:蛇) java.lang.String getLunarAnimal() 返回String类型的生肖(例如:蛇) java.lang.String getLunarDate() 返回String类型的阴历日期(例如:廿) java.lang.String getLunarMonth() 返回String类型的阴历月份(例如:七) java.lang.String getLunarYear() 返回String类型的阴历年份(天干地支,例如:癸巳) java.lang.String toString() 返回String类型的阴历日期(例如:癸巳年七月廿) JAR包名称:LunarCalendar version 1.0 8/26/2013 作者:Roy, Liu royliu90@live.cn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值