JAVA版农历和阳历相互转换源码

public   class  TestNongLi  {
  
public static void main(String[] args) {
    
// 调用农历日期转换阳历日期方法
    System.out.println(ChineseCalendar.sCalendarLundarToSolar(200811));
  }

}


//  自定义日历类
class  ChineseCalendar  {

  
// Array lIntLunarDay is stored in the monthly day information in every year from 1901 to 2100 of the lunar calendar,
  
// The lunar calendar can only be 29 or 30 days every month, express with 12(or 13) pieces of binary bit in one year,
  
// it is 30 days for 1 form in the corresponding location , otherwise it is 29 days
  private static final int[] iLunarMonthDaysTable = 0x4ae00xa5700x52680xd2600xd9500x6aa80x56a00x9ad00x4ae8,
      
0x4ae0// 1910
      0xa4d80xa4d00xd2500xd5480xb5500x56a00x96d00x95b00x49b80x49b0// 1920
      0xa4b00xb2580x6a500x6d400xada80x2b600x95700x49780x49700x64b0// 1930
      0xd4a00xea500x6d480x5ad00x2b600x93700x92e00xc9680xc9500xd4a0// 1940
      0xda500xb5500x56a00xaad80x25d00x92d00xc9580xa9500xb4a80x6ca0// 1950
      0xb5500x55a80x4da00xa5b00x52b80x52b00xa9500xe9500x6aa00xad50// 1960
      0xab500x4b600xa5700xa5700x52600xe9300xd9500x5aa80x56a00x96d0// 1970
      0x4ae80x4ad00xa4d00xd2680xd2500xd5280xb5400xb6a00x96d00x95b0// 1980
      0x49b00xa4b80xa4b00xb2580x6a500x6d400xada00xab600x93700x4978// 1990
      0x49700x64b00x6a500xea500x6b280x5ac00xab600x93680x92e00xc960// 2000
      0xd4a80xd4a00xda500x5aa80x56a00xaad80x25d00x92d00xc9580xa950// 2010
      0xb4a00xb5500xb5500x55a80x4ba00xa5b00x52b80x52b00xa9300x74a8// 2020
      0x6aa00xad500x4da80x4b600x95700xa4e00xd2600xe9300xd5300x5aa0// 2030
      0x6b500x96d00x4ae80x4ad00xa4d00xd2580xd2500xd5200xdaa00xb5a0// 2040
      0x56d00x4ad80x49b00xa4b80xa4b00xaa500xb5280x6d200xada00x55b0 // 2050
  }
;

  
// Array iLunarLeapMonthTable preserves the lunar calendar leap month from 1901 to 2050,
  
// if it is 0 express not to have , every byte was stored for two years
  private static final char[] iLunarLeapMonthTable = 0x000x500x040x000x20// 1910
      0x600x050x000x200x70// 1920
      0x050x000x400x020x06// 1930
      0x000x500x030x070x00// 1940
      0x600x040x000x200x70// 1950
      0x050x000x300x800x06// 1960
      0x000x400x030x070x00// 1970
      0x500x040x080x000x60// 1980
      0x040x0a0x000x600x05// 1990
      0x000x300x800x050x00// 2000
      0x400x020x070x000x50// 2010
      0x040x090x000x600x04// 2020
      0x000x200x600x050x00// 2030
      0x300xb00x060x000x50// 2040
      0x020x070x000x500x03 // 2050
  }
;

  
// Array iSolarLunarTable stored the offset days
  
// in New Year of solar calendar and lunar calendar from 1901 to 2050;
  private static final char[] iSolarLunarOffsetTable = 49382846342443322140// 1910
      29483625443422413150// 1920
      38274635234332224029// 1930
      47362544342341304938// 1940
      26453524433221402847// 1950
      36264433234230483827// 1960
      45352443322039294736// 1970
      26453322413048372746// 1980
      35244332503928473626// 1990
      45342240304937274635// 2000
      23423121392848372544// 2010
      33234131503928473524// 2020
      42302140284736254333// 2030
      22413049372644332342// 2040
      31214029473625443222// 2050
  }
;

  
static boolean bIsSolarLeapYear(int iYear) {
    
return ((iYear % 4 == 0&& (iYear % 100 != 0|| iYear % 400 == 0);
  }


  
// The days in the month of solar calendar
  static int iGetSYearMonthDays(int iYear, int iMonth) {
    
if ((iMonth == 1|| (iMonth == 3|| (iMonth == 5|| (iMonth == 7|| (iMonth == 8|| (iMonth == 10|| (iMonth == 12))
      
return 31;
    
else if ((iMonth == 4|| (iMonth == 6|| (iMonth == 9|| (iMonth == 11))
      
return 30;
    
else if (iMonth == 2{
      
if (bIsSolarLeapYear(iYear))
        
return 29;
      
else
        
return 28;
    }
 else
      
return 0;
  }


  
// The offset days from New Year and the day when point out in solar calendar
  static int iGetSNewYearOffsetDays(int iYear, int iMonth, int iDay) {
    
int iOffsetDays = 0;

    
for (int i = 1; i < iMonth; i++{
      iOffsetDays 
+= iGetSYearMonthDays(iYear, i);
    }

    iOffsetDays 
+= iDay - 1;

    
return iOffsetDays;
  }


  
static int iGetLLeapMonth(int iYear) {
    
char iMonth = iLunarLeapMonthTable[(iYear - 1901/ 2];

    
if (iYear % 2 == 0)
      
return (iMonth & 0x0f);
    
else
      
return (iMonth & 0xf0>> 4;
  }


  
static int iGetLMonthDays(int iYear, int iMonth) {
    
int iLeapMonth = iGetLLeapMonth(iYear);
    
if ((iMonth > 12&& (iMonth - 12 != iLeapMonth) || (iMonth < 0)) {
      System.out.println(
"Wrong month, ^_^ , i think you are want a -1, go to death!");
      
return -1;
    }

    
if (iMonth - 12 == iLeapMonth) {
      
if ((iLunarMonthDaysTable[iYear - 1901& (0x8000 >> iLeapMonth)) == 0)
        
return 29;
      
else
        
return 30;
    }

    
if ((iLeapMonth > 0&& (iMonth > iLeapMonth))
      iMonth
++;
    
if ((iLunarMonthDaysTable[iYear - 1901& (0x8000 >> (iMonth - 1))) == 0)
      
return 29;
    
else
      
return 30;
  }


  
// Days in this year of lunar calendar
  static int iGetLYearDays(int iYear) {
    
int iYearDays = 0;
    
int iLeapMonth = iGetLLeapMonth(iYear);

    
for (int i = 1; i < 13; i++)
      iYearDays 
+= iGetLMonthDays(iYear, i);
    
if (iLeapMonth > 0)
      iYearDays 
+= iGetLMonthDays(iYear, iLeapMonth + 12);
    
return iYearDays;
  }


  
static int iGetLNewYearOffsetDays(int iYear, int iMonth, int iDay) {
    
int iOffsetDays = 0;
    
int iLeapMonth = iGetLLeapMonth(iYear);

    
if ((iLeapMonth > 0&& (iLeapMonth == iMonth - 12)) {
      iMonth 
= iLeapMonth;
      iOffsetDays 
+= iGetLMonthDays(iYear, iMonth);
    }


    
for (int i = 1; i < iMonth; i++{
      iOffsetDays 
+= iGetLMonthDays(iYear, i);
      
if (i == iLeapMonth)
        iOffsetDays 
+= iGetLMonthDays(iYear, iLeapMonth + 12);
    }

    iOffsetDays 
+= iDay - 1;

    
return iOffsetDays;
  }


  
// The solar calendar is turned into the lunar calendar
  static String sCalendarSolarToLundar(int iYear, int iMonth, int iDay) {
    
int iLDay, iLMonth, iLYear;
    
int iOffsetDays = iGetSNewYearOffsetDays(iYear, iMonth, iDay);
    
int iLeapMonth = iGetLLeapMonth(iYear);

    
if (iOffsetDays < iSolarLunarOffsetTable[iYear - 1901]) {
      iLYear 
= iYear - 1;
      iOffsetDays 
= iSolarLunarOffsetTable[iYear - 1901- iOffsetDays;
      iLDay 
= iOffsetDays;

      
for (iLMonth = 12; iOffsetDays > iGetLMonthDays(iLYear, iLMonth); iLMonth--{
        iLDay 
= iOffsetDays;
        iOffsetDays 
-= iGetLMonthDays(iLYear, iLMonth);
      }

      
if (0 == iLDay)
        iLDay 
= 1;
      
else
        iLDay 
= iGetLMonthDays(iLYear, iLMonth) - iOffsetDays + 1;
    }
 else {
      iLYear 
= iYear;
      iOffsetDays 
-= iSolarLunarOffsetTable[iYear - 1901];
      iLDay 
= iOffsetDays + 1;

      
for (iLMonth = 1; iOffsetDays >= 0; iLMonth++{
        iLDay 
= iOffsetDays + 1;
        iOffsetDays 
-= iGetLMonthDays(iLYear, iLMonth);
        
if ((iLeapMonth == iLMonth) && (iOffsetDays > 0)) {
          iLDay 
= iOffsetDays;
          iOffsetDays 
-= iGetLMonthDays(iLYear, iLMonth + 12);
          
if (iOffsetDays <= 0{
            iLMonth 
+= 12 + 1;
            
break;
          }

        }

      }

      iLMonth
--;
    }

    
return "" + iLYear + (iLMonth > 9 ? "" + iLMonth : "0" + iLMonth) + (iLDay > 9 ? "" + iLDay : "0" + iLDay);
  }


  
// The lunar calendar is turned into the Solar calendar
  static String sCalendarLundarToSolar(int iYear, int iMonth, int iDay) {
    
int iSYear, iSMonth, iSDay;
    
int iOffsetDays = iGetLNewYearOffsetDays(iYear, iMonth, iDay) + iSolarLunarOffsetTable[iYear - 1901];
    
int iYearDays = bIsSolarLeapYear(iYear) ? 366 : 365;

    
if (iOffsetDays >= iYearDays) {
      iSYear 
= iYear + 1;
      iOffsetDays 
-= iYearDays;
    }
 else {
      iSYear 
= iYear;
    }

    iSDay 
= iOffsetDays + 1;
    
for (iSMonth = 1; iOffsetDays >= 0; iSMonth++{
      iSDay 
= iOffsetDays + 1;
      iOffsetDays 
-= iGetSYearMonthDays(iSYear, iSMonth);
    }

    iSMonth
--;

    
return "" + iSYear + (iSMonth > 9 ? iSMonth + "" : "0" + iSMonth) + (iSDay > 9 ? iSDay + "" : "0" + iSDay);
  }

}


//  自定义星期类
class  Week  {
  
int iWeek;

  
private String sWeek[] = "Sunday""Monday""Tuesday""Wednesday""Thursday""Friday""Saturday" };

  
public Week() {
    iWeek 
= 0;
  }


  
public Week(int w) {
    
if ((w > 6|| (w < 0)) {
      System.out.println(
"Week out of range, I think you want Sunday");
      
this.iWeek = 0;
    }
 else
      
this.iWeek = w;
  }


  
public String toString() {
    
return sWeek[iWeek];
  }

}


//  自定义日期类
class  MyDate  {

  
public int iYear;

  
public int iMonth;

  
public int iDay;

  
private static int checkYear(int iYear) {
    
if ((iYear > 1901&& (iYear < 2050))
      
return iYear;
    
else {
      System.out.println(
"The Year out of range, I think you want 1981");
      
return 1981;
    }

  }


  
public MyDate(int iYear, int iMonth, int iDay) {
    
this.iYear = checkYear(iYear);
    
this.iMonth = iMonth;
    
this.iDay = iDay;
  }


  
public MyDate(int iYear, int iMonth) {
    
this.iYear = checkYear(iYear);
    
this.iMonth = iMonth;
    
this.iDay = 1;
  }


  
public MyDate(int iYear) {
    
this.iYear = checkYear(iYear);
    
this.iMonth = 1;
    
this.iDay = 1;
  }


  
public MyDate() {
    
this.iYear = 1981;
    
this.iMonth = 1;
    
this.iDay = 1;
  }


  
public String toString() {
    
return "" + this.iYear + (this.iMonth > 9 ? "" + this.iMonth : "0" + this.iMonth)
        
+ (this.iDay > 9 ? "" + this.iDay : "0" + this.iDay);
  }


  
public boolean equals(MyDate md) {
    
return ((md.iDay == this.iDay) && (md.iMonth == this.iMonth) && (md.iYear == this.iYear));
  }

}


//  阳历日期类,继承自定义日期
class  SolarDate  extends  MyDate  {

  
private static int checkMonth(int iMonth) {
    
if (iMonth > 12{
      System.out.println(
"Month out of range, I think you want 12 ");
      
return 12;
    }
 else if (iMonth < 1{
      System.out.println(
"Month out of range, I think you want 1 ");
      
return 1;
    }
 else
      
return iMonth;
  }


  
private static int checkDay(int iYear, int iMonth, int iDay) {
    
int iMonthDays = ChineseCalendar.iGetSYearMonthDays(iYear, iMonth);

    
if (iDay > iMonthDays) {
      System.out.println(
"Day out of range, I think you want " + iMonthDays + " ");
      
return iMonthDays;
    }
 else if (iDay < 1{
      System.out.println(
"Day out of range, I think you want 1 ");
      
return 1;
    }
 else
      
return iDay;
  }


  
public SolarDate(int iYear, int iMonth, int iDay) {
    
super(iYear);
    
this.iMonth = checkMonth(iMonth);
    
this.iDay = checkDay(this.iYear, this.iMonth, iDay);
  }


  
public SolarDate(int iYear, int iMonth) {
    
super(iYear);
    
this.iMonth = checkMonth(iMonth);
  }


  
public SolarDate(int iYear) {
    
super(iYear);
  }


  
public SolarDate() {
    
super();
  }


  
public String toString() {
    
return "" + this.iYear + (this.iMonth > 9 ? "-" + this.iMonth : "-0" + this.iMonth)
        
+ (this.iDay > 9 ? "-" + this.iDay : "-0" + this.iDay);
  }


  
public Week toWeek() {
    
int iOffsetDays = 0;
    
for (int i = 1901; i < iYear; i++{
      
if (ChineseCalendar.bIsSolarLeapYear(i))
        iOffsetDays 
+= 366;
      
else
        iOffsetDays 
+= 365;
    }


    iOffsetDays 
+= ChineseCalendar.iGetSNewYearOffsetDays(iYear, iMonth, iDay);
    
return new Week((iOffsetDays + 2% 7);
  }


  
public LunarDate toLunarDate() {
    
int iYear, iMonth, iDay, iDate;
    LunarDate ld;
    iDate 
= Integer.parseInt(ChineseCalendar.sCalendarSolarToLundar(this.iYear, this.iMonth, this.iDay));
    iYear 
= iDate / 10000;
    iMonth 
= iDate % 10000 / 100;
    iDay 
= iDate % 100;
    ld 
= new LunarDate(iYear, iMonth, iDay);
    
return ld;
  }

}


//  阴历日期类,继承自定义日期类
class  LunarDate  extends  MyDate  {

  
private String sChineseNum[] = """""""""""""""""""""" };

  
private static int checkMonth(int iYear, int iMonth) {
    
if ((iMonth > 12&& (iMonth == ChineseCalendar.iGetLLeapMonth(iYear) + 12)) {
      
return iMonth;
    }
 else if (iMonth > 12{
      System.out.println(
"Month out of range, I think you want 12 ");
      
return 12;
    }
 else if (iMonth < 1{
      System.out.println(
"Month out of range, I think you want 1 ");
      
return 1;
    }
 else
      
return iMonth;
  }


  
private static int checkDay(int iYear, int iMonth, int iDay) {
    
int iMonthDays = ChineseCalendar.iGetLMonthDays(iYear, iMonth);

    
if (iDay > iMonthDays) {
      System.out.println(
"Day out of range, I think you want " + iMonthDays + " ");
      
return iMonthDays;
    }
 else if (iDay < 1{
      System.out.println(
"Day out of range, I think you want 1 ");
      
return 1;
    }
 else
      
return iDay;
  }


  
public LunarDate(int iYear, int iMonth, int iDay) {
    
super(iYear);
    
this.iMonth = checkMonth(this.iYear, iMonth);
    
this.iDay = checkDay(this.iYear, this.iMonth, iDay);
  }


  
public LunarDate(int iYear, int iMonth) {
    
super(iYear);
    
this.iMonth = checkMonth(this.iYear, iMonth);
  }


  
public LunarDate(int iYear) {
    
super(iYear);
  }


  
public LunarDate() {
    
super();
  }


  
public String toString() {
    String sCalendar 
= "农历";

    sCalendar 
+= sChineseNum[iYear / 1000+ sChineseNum[iYear % 1000 / 100+ sChineseNum[iYear % 100 / 10]
        
+ sChineseNum[iYear % 10+ "(" + toChineseEra() + ")年";
    
if (iMonth > 12{
      iMonth 
-= 12;
      sCalendar 
+= "";
    }

    
if (iMonth == 12)
      sCalendar 
+= "腊月";
    
else if (iMonth == 11)
      sCalendar 
+= "冬月";
    
else if (iMonth == 1)
      sCalendar 
+= "正月";
    
else
      sCalendar 
+= sChineseNum[iMonth] + "";
    
if (iDay > 29)
      sCalendar 
+= "三十";
    
else if (iDay > 20)
      sCalendar 
+= "二十" + sChineseNum[iDay % 20];
    
else if (iDay == 20)
      sCalendar 
+= "二十";
    
else if (iDay > 10)
      sCalendar 
+= "" + sChineseNum[iDay % 10];
    
else
      sCalendar 
+= "" + sChineseNum[iDay];

    
return sCalendar;
  }


  
public CnWeek toWeek() {
    
int iOffsetDays = 0;
    
for (int i = 1901; i < iYear; i++)
      iOffsetDays 
+= ChineseCalendar.iGetLYearDays(i);

    iOffsetDays 
+= ChineseCalendar.iGetLNewYearOffsetDays(iYear, iMonth, iDay);
    
return new CnWeek((iOffsetDays + 2% 7);
  }


  
public ChineseEra toChineseEra() {
    
return new ChineseEra(iYear);
  }


  
public SolarDate toSolarDate() {
    
int iYear, iMonth, iDay, iDate;
    SolarDate sd;
    iDate 
= Integer.parseInt(ChineseCalendar.sCalendarLundarToSolar(this.iYear, this.iMonth, this.iDay));
    iYear 
= iDate / 10000;
    iMonth 
= iDate % 10000 / 100;
    iDay 
= iDate % 100;
    sd 
= new SolarDate(iYear, iMonth, iDay);
    
return sd;
  }

}


class  CnWeek  extends  Week  {

  
private String sCnWeek[] = """""""""""""" };

  
public CnWeek() {
    
super();
  }


  
public CnWeek(int iWeek) {
    
super(iWeek);
  }


  
public String toString() {
    
return "星期" + sCnWeek[this.iWeek];
  }

}


class  ChineseEra  {
  
int iYear;

  String[] sHeavenlyStems 
= """""""""""""""""""" };

  String[] sEarthlyBranches 
= """""""""""""""""""""""" };

  
public ChineseEra() {
    
int iYear = 1981;
  }


  
public ChineseEra(int iYear) {
    
if ((iYear < 2050&& (iYear > 1901))
      
this.iYear = iYear;
    
else
      
this.iYear = 1981;
  }


  
public String toString() {
    
int temp;
    temp 
= Math.abs(iYear - 1924);
    
return sHeavenlyStems[temp % 10+ sEarthlyBranches[temp % 12];
  }

}

你可能感兴趣的:(JAVA版农历和阳历相互转换源码)