`

农历和阳历互换的java版

    博客分类:
  • Java
 
阅读更多
找来找去,终于找到一个可以使用的版本,特记录如下
//实现类


package com.java.calendar;
//     自定义日历类 
public 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 = { 
    	 0x4ae0, 0xa570, 0x5268, 0xd260, 0xd950, 0x6aa8, 0x56a0, 0x9ad0, 0x4ae8, 0x4ae0, // 1910
    	0xa4d8, 0xa4d0, 0xd250, 0xd548, 0xb550, 0x56a0, 0x96d0, 0x95b0, 0x49b8, 0x49b0, // 1920
    	0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada8, 0x2b60, 0x9570, 0x4978, 0x4970, 0x64b0, // 1930
    	0xd4a0, 0xea50, 0x6d48, 0x5ad0, 0x2b60, 0x9370, 0x92e0, 0xc968, 0xc950, 0xd4a0, // 1940
    	0xda50, 0xb550, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, 0xb4a8, 0x6ca0, // 1950
    	0xb550, 0x55a8, 0x4da0, 0xa5b0, 0x52b8, 0x52b0, 0xa950, 0xe950, 0x6aa0, 0xad50, // 1960
    	0xab50, 0x4b60, 0xa570, 0xa570, 0x5260, 0xe930, 0xd950, 0x5aa8, 0x56a0, 0x96d0, // 1970
    	0x4ae8, 0x4ad0, 0xa4d0, 0xd268, 0xd250, 0xd528, 0xb540, 0xb6a0, 0x96d0, 0x95b0, // 1980
    	0x49b0, 0xa4b8, 0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada0, 0xab60, 0x9370, 0x4978, // 1990
    	0x4970, 0x64b0, 0x6a50, 0xea50, 0x6b28, 0x5ac0, 0xab60, 0x9368, 0x92e0, 0xc960, // 2000
    	0xd4a8, 0xd4a0, 0xda50, 0x5aa8, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, // 2010
    	0xb4a0, 0xb550, 0xb550, 0x55a8, 0x4ba0, 0xa5b0, 0x52b8, 0x52b0, 0xa930, 0x74a8, // 2020
    	0x6aa0, 0xad50, 0x4da8, 0x4b60, 0x9570, 0xa4e0, 0xd260, 0xe930, 0xd530, 0x5aa0, // 2030
    	0x6b50, 0x96d0, 0x4ae8, 0x4ad0, 0xa4d0, 0xd258, 0xd250, 0xd520, 0xdaa0, 0xb5a0, // 2040
    	0x56d0, 0x4ad8, 0x49b0, 0xa4b8, 0xa4b0, 0xaa50, 0xb528, 0x6d20, 0xada0, 0x55b0 // 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 = { 0x00, 0x50, 0x04, 0x00, 0x20, // 1910
    	0x60, 0x05, 0x00, 0x20, 0x70, // 1920
    	0x05, 0x00, 0x40, 0x02, 0x06, // 1930
    	0x00, 0x50, 0x03, 0x07, 0x00, // 1940
    	0x60, 0x04, 0x00, 0x20, 0x70, // 1950
    	0x05, 0x00, 0x30, 0x80, 0x06, // 1960
    	0x00, 0x40, 0x03, 0x07, 0x00, // 1970
    	0x50, 0x04, 0x08, 0x00, 0x60, // 1980
    	0x04, 0x0a, 0x00, 0x60, 0x05, // 1990
    	0x00, 0x30, 0x80, 0x05, 0x00, // 2000
    	0x40, 0x02, 0x07, 0x00, 0x50, // 2010
    	0x04, 0x09, 0x00, 0x60, 0x04, // 2020
    	0x00, 0x20, 0x60, 0x05, 0x00, // 2030
    	0x30, 0xb0, 0x06, 0x00, 0x50, // 2040
    	0x02, 0x07, 0x00, 0x50, 0x03 // 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 = { 49, 38, 28, 46, 34, 24, 43, 32, 21, 40, // 1910
    	29, 48, 36, 25, 44, 34, 22, 41, 31, 50, // 1920
    	38, 27, 46, 35, 23, 43, 32, 22, 40, 29, // 1930
    	47, 36, 25, 44, 34, 23, 41, 30, 49, 38, // 1940
    	26, 45, 35, 24, 43, 32, 21, 40, 28, 47, // 1950
    	36, 26, 44, 33, 23, 42, 30, 48, 38, 27, // 1960
    	45, 35, 24, 43, 32, 20, 39, 29, 47, 36, // 1970
    	26, 45, 33, 22, 41, 30, 48, 37, 27, 46, // 1980
    	35, 24, 43, 32, 50, 39, 28, 47, 36, 26, // 1990
    	45, 34, 22, 40, 30, 49, 37, 27, 46, 35, // 2000
    	23, 42, 31, 21, 39, 28, 48, 37, 25, 44, // 2010
    	33, 22, 41, 31, 50, 39, 28, 47, 35, 24, // 2020
    	42, 30, 21, 40, 28, 47, 36, 25, 43, 33, // 2030
    	22, 41, 30, 49, 37, 26, 44, 33, 23, 42, // 2040
    	31, 21, 40, 29, 47, 36, 25, 44, 32, 22, // 2050
      };
    	static boolean bIsSolarLeapYear(int iYear) {
    		return ((iYear % 4 == 0) && (iYear % 100 != 0) || iYear % 400 == 0);
    	}
//     The days in the month of solar calendar 
    public 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 
    public 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;
    }
    public static int iGetLLeapMonth(int iYear) {
        char iMonth = iLunarLeapMonthTable[(iYear - 1901) / 2];

        if (iYear % 2 == 0)
          return (iMonth & 0x0f);
        else
          return (iMonth & 0xf0) >> 4;
    }
    public 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 
    public 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;
    	}
    public 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 
    public 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 
    public 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);
    }
}


//测试类


package com.java.calendar;
public class Test {
    public static void main(String[] args) {
//     调用阳历日期转换农历日期方法 
        System.out.println(ChineseCalendar.sCalendarSolarToLundar(2012, 4, 9));
//     调用农历日期转换阳历日期方法 
        System.out.println(ChineseCalendar.sCalendarLundarToSolar(2012, 3, 19));
    }
}
分享到:
评论

相关推荐

    java 万年历(农历和阳历的互换)

    总的来说,构建一个能够处理农历和阳历互换的Java万年历系统,不仅考验编程技术,还要求对天文学有一定的了解,是一项既有挑战性又有趣的任务。通过这个项目,开发者可以深入理解日期时间处理的细节,提升问题解决...

    中国农历,阳历互换(Java 源代码)

    本主题将详细介绍如何在Java中实现农历和阳历之间的转换。 首先,Java标准库并没有内置农历日期的支持,但我们可以利用第三方库,如`FastDateFormat`或`org.apache.commons.lang3.time.DateUtils`来处理阳历日期。...

    公历农历互换

    在IT领域,日期和时间的处理是至关重要的部分,尤其在中国,我们经常需要在公历(阳历)和农历(阴历)之间进行转换。公历是国际通用的日历系统,而农历则更加符合中国的传统习俗,如节日、节气等。本主题将深入探讨...

    公历农历互换的javascript

    个人觉得还不错的一个公历农历互换的javascript,希望方便大家

    电子万年历中公历农历互换算法研究

    本文介绍了一种在电子万年历中实现公历和农历互换的有效算法。该算法利用四个字节的数据来精确描述任意一年的所有相关信息,并通过建立一个基本数据表来存储这些数据。电子设备可以通过查询这个预先存储好的数据表来...

    公历、农历互换组件 <img src="/images/sunny.gif" align="absmi

    公历、农历互换组件完成公历和农历之间的互相转换,组件的属性如下:属性:LunarDate:TLunarDate;TLunarDate类由下列属性和方法组成属性:lDay:Word; 农历年的日。属性:lMonth:Word; 农历年的月。属性:lYear: Word; ...

    在PB中使用 动态链接库,阳历转阴历

    pb中使用 声明: function long MyFormatLunarYear(long iYear,ref string text) library "calendar.dll" function long MyGetLunarDate(long iYear...st_2.text="今天是:"+"阳历"+string(today())+","+"阴历"+ls_yinli

    java范例开发大全源代码

     实例198 万年历(农历和阳历的互换) 337  11.4 Formatter类的使用 347  实例199 时间格式转换符的使用 347  实例200 数据格式转换符的使用 349  11.5 System类的使用 351  实例201 记录程序执行的...

    java范例开发大全

    实例198 万年历(农历和阳历的互换) 337 11.4 Formatter类的使用 347 实例199 时间格式转换符的使用 347 实例200 数据格式转换符的使用 349 11.5 System类的使用 351 实例201 记录程序执行的时间 351 实例202 程序...

    Java范例开发大全 (源程序)

     实例198 万年历(农历和阳历的互换) 337  11.4 Formatter类的使用 347  实例199 时间格式转换符的使用 347  实例200 数据格式转换符的使用 349  11.5 System类的使用 351  实例201 记录程序执行的时间 ...

    java范例开发大全(pdf&源码)

    实例198 万年历(农历和阳历的互换) 337 11.4 Formatter类的使用 347 实例199 时间格式转换符的使用 347 实例200 数据格式转换符的使用 349 11.5 System类的使用 351 实例201 记录程序执行的时间 351 实例202 程序...

    Java范例开发大全(全书源程序)

    实例198 万年历(农历和阳历的互换) 337 11.4 Formatter类的使用 347 实例199 时间格式转换符的使用 347 实例200 数据格式转换符的使用 349 11.5 System类的使用 351 实例201 记录程序执行的时间 351 实例202...

    心情提醒 2.01.000 Release16

    一个很好的提醒软件,支持记录导出导入,农历阳历互换(我经常使用这个功能查看农历,呵呵),开机提醒等功能。。如果您只想找个实用的提醒软件,推荐使用!本人一直在用,也不期望最新版,个人认为有这些功能已经...

    单位换算小精灵各种单位的换算

    在日常生活中,我们可能需要将不同格式的日期或时间进行转换,例如公历与农历的转换、不同国家的日期表示方式(如日/月/年与月/日/年)的互换,或者将时间从24小时制转换为12小时制。这款软件能轻松解决这些问题,使...

    易语言540个易模块

    工具提示 公历转农历模块 1.0 功能集一模块 供应商管理模块 关闭窗口或进程 关机管理 关联程序 关联文件 关于菜单的一些修改操作 关于窗口 管理员登录验证模块(未加密)1.0 光驱控制模块 H HTTP访问模块1.0 ...

    易语言模块914个

    公历转农历模块 1.0.ec 公历转换为农历.ec 六六自用模块.ec 六十四卦相.ec 关于窗口.ec 关于菜单的一些修改操作.ec 关机管理.ec 关联.ec 关联数据库和新表格.ec 关联文件.ec 关联程序.ec 关闭窗口或进程...

    1345个易语言模块

    公历转农历模块 1.0.ec 公历转换为农历.ec 六六自用 模块.ec 六十四卦相.ec 关于窗口.ec 关于菜单的一些修改操作.ec 关机管理.ec 关联.ec 关联 数据库和新表格.ec 关联文件.ec 关联程序.ec 关闭托盘图标.ec 关闭窗口...

Global site tag (gtag.js) - Google Analytics