前言

由于工作需要,需要输入公历(阳历)日期然后输出农历(阴历)日期格式,刚接这个活,我就一个想法:我勒个大操,还有这样的需求,好吧,上网查查资料吧,通过网友的资料,我整合了一下,因该够大众用了,如果还需要别的格式,你可以改改方法成你需要的,放心不难,静下心来整整哦.

代码如下

package com.utils;import java.util.Calendar;
import java.util.Date;
public final class LunarCalendarUtil {//农历(阴历)年,月,日private static int yearCyl;private static int monCyl;private static int dayCyl;//公历(阳历)年,月,日private static int year;private static int month;private static int day;private static boolean isLeap;private static int[] lunarInfo = {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};private static int[] solarMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30, 31};private static String[] Gan = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛","壬", "癸"};private static String[] Zhi = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未","申", "酉", "戌", "亥"};private static String[] Animals = {"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊","猴", "鸡", "狗", "猪"};private static int[] sTermInfo = {0, 21208, 42467, 63836, 85337, 107014,128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989,308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224,483532, 504758};private static String[] nStr1 = {"日", "一", "二", "三", "四", "五", "六", "七","八", "九", "十"};private static String[] nStr2 = {"初", "十", "廿", "卅", " "};private static String[] monthNong = {"", "正", "二", "三", "四", "五", "六", "七","八", "九", "十", "冬", "腊"};private static String[] yearName = {"零", "壹", "贰", "叁", "肆", "伍", "陆","柒", "捌", "玖"};private Object LogFactory;public Lauar() {}/*** 传回农历 y年的总天数* @param y* @return*/private static int lYearDays(int y) {int i;int sum = 348; //29*12for (i = 0x8000; i > 0x8; i >>= 1) {sum += (lunarInfo[y - 1900] & i) == 0 ? 0 : 1; //大月+1天}return (sum + leapDays(y)); //+闰月的天数}/*** 传回农历 y年闰月的天数* @param y* @return*/private static int leapDays(int y) {if (leapMonth(y) != 0) {return ((lunarInfo[y - 1900] & 0x10000) == 0 ? 29 : 30);} else {return (0);}}/*** 传回农历 y年闰哪个月 1-12 , 没闰传回 0* @param y* @return*/private static int leapMonth(int y) {return (lunarInfo[y - 1900] & 0xf);}/*** 传回农历 y年m月的总天数* @param y* @param m* @return*/private static int monthDays(int y, int m) {return ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0 ? 29 : 30);}/*** 算出农历, 传入日期物件, 传回农历日期物件* 该物件属性有 .year .month .day .isLeap .yearCyl .dayCyl .monCyl* @param objDate*/private static void Lunar1(Date objDate) {int i, leap = 0, temp = 0;Calendar cl = Calendar.getInstance();cl.set(1900, 0, 31); //1900-01-31是农历1900年正月初一Date baseDate = cl.getTime();//1900-01-31是农历1900年正月初一int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000); //天数(86400000=24*60*60*1000)//1899-12-21是农历1899年腊月甲子日dayCyl = offset + 40;//1898-10-01是农历甲子月monCyl = 14;//得到年数for (i = 1900; i < 2050 && offset > 0; i++) {//农历每年天数temp = lYearDays(i);offset -= temp;monCyl += 12;}if (offset < 0) {offset += temp;i--;monCyl -= 12;}year = i; //农历年份yearCyl = i - 1864; //1864年是甲子年leap = leapMonth(i); //闰哪个月isLeap = false;for (i = 1; i < 13 && offset > 0; i++) {//闰月if (leap > 0 && i == (leap + 1) && isLeap == false) {--i;isLeap = true;temp = leapDays(year);} else {temp = monthDays(year, i);}//解除闰月if (isLeap == true && i == (leap + 1)) {isLeap = false;}offset -= temp;if (isLeap == false) {monCyl++;}}if (offset == 0 && leap > 0 && i == leap + 1) {if (isLeap) {isLeap = false;} else {isLeap = true;--i;--monCyl;}}if (offset < 0) {offset += temp;--i;--monCyl;}month = i; //农历月份day = offset + 1; //农历天份}/*** 传入 offset 传回干支, 0=甲子* @param num* @return*/private static String cyclical(int num) {return (Gan[num % 10] + Zhi[num % 12]);}/*** 中文日期* @param d* @return*/private static String cDay(int d) {String s;switch (d) {case 10:s = "初十";break;case 20:s = "二十";break;case 30:s = "三十";break;default:s = nStr2[(int) (d / 10)];//取商s += nStr1[d % 10];//取余}return (s);}private static String cYear(int y) {String s = " ";int d;while (y > 0) {d = y % 10;y = (y - d) / 10;s = yearName[d] + s;}return (s);}private static int getYear() {return (year);}private static int getMonth() {return (month);}private static int getDay() {return (day);}private static int getMonCyl() {return (monCyl);}private static int getYearCyl() {return (yearCyl);}private static int getDayCyl() {return (dayCyl);}private static boolean getIsLeap() {return (isLeap);}/*** 获取-农历详细日期* @param year* @param month* @param day* @return*/public static String getLunarDetails(String year, String month, String day) {Date sDObj;String s;int SY, SM, SD;int sy;SY = Integer.parseInt(year);SM = Integer.parseInt(month);SD = Integer.parseInt(day);sy = (SY - 4) % 12;Calendar cl = Calendar.getInstance();cl.set(SY, SM - 1, SD);sDObj = cl.getTime();//日期Lunar1(sDObj); //农历StringBuffer lMDBuffer = new StringBuffer();lMDBuffer.append("农历");lMDBuffer.append("【");lMDBuffer.append(Animals[sy]);lMDBuffer.append("】");lMDBuffer.append(cYear(getYear()));lMDBuffer.append("年 ");lMDBuffer.append((getIsLeap() ? "闰" : ""));lMDBuffer.append(monthNong[getMonth()]);lMDBuffer.append("月");lMDBuffer.append((monthDays(getYear(), getMonth()) == 29 ? "小" : "大"));lMDBuffer.append(cDay(getDay()));lMDBuffer.append(" ");lMDBuffer.append(cyclical(getYearCyl()));lMDBuffer.append("年");lMDBuffer.append(cyclical(getMonCyl()));lMDBuffer.append("月");lMDBuffer.append(cyclical(getDayCyl()));lMDBuffer.append("日");return lMDBuffer.toString();}/*** 获取-农历年月日* @param year* @param month* @param day* @return*/public static String getLunarYearMonthDay(String year, String month, String day) {Date sDObj;int SY, SM, SD;int sy;SY = Integer.parseInt(year);SM = Integer.parseInt(month);SD = Integer.parseInt(day);sy = (SY - 4) % 12;Calendar cl = Calendar.getInstance();cl.set(SY, SM - 1, SD);sDObj = cl.getTime();//日期Lunar1(sDObj); //农历StringBuffer lMDBuffer = new StringBuffer();lMDBuffer.append("农历");lMDBuffer.append(cyclical(getYearCyl()));lMDBuffer.append("(");lMDBuffer.append(Animals[sy]);lMDBuffer.append(")年");lMDBuffer.append(monthNong[getMonth()]);lMDBuffer.append("月");lMDBuffer.append(cDay(getDay()));return lMDBuffer.toString();}/*** 获取-农历月日* @param year* @param month* @param day* @return*/public static String getLunarMonthDay(String year, String month, String day) {Date sDObj;String s;int SY, SM, SD;SY = Integer.parseInt(year);SM = Integer.parseInt(month);SD = Integer.parseInt(day);Calendar cl = Calendar.getInstance();cl.set(SY, SM - 1, SD);sDObj = cl.getTime();//日期Lunar1(sDObj); //农历StringBuffer lMDBuffer = new StringBuffer();lMDBuffer.append(monthNong[getMonth()]);lMDBuffer.append("月");lMDBuffer.append(cDay(getDay()));return lMDBuffer.toString();}public static void main(String[] args) {System.out.println(getLunarDetails("1990", "12", "22"));System.out.println(getLunarDetails("2019", "1", "22"));System.out.println(getLunarDetails("2019", "2", "10"));System.out.println(getLunarDetails("2020", "03", "03"));System.out.println(getLunarYearMonthDay("1990", "12", "22"));System.out.println(getLunarYearMonthDay("2019", "1", "22"));System.out.println(getLunarYearMonthDay("2019", "2", "10"));System.out.println(getLunarYearMonthDay("2020", "03", "03"));System.out.println(getLunarMonthDay("1990", "12", "22"));System.out.println(getLunarMonthDay("2019", "1", "22"));System.out.println(getLunarMonthDay("2019", "2", "10"));System.out.println(getLunarMonthDay("2020", "03", "03"));}
}

main方法测试输出结果:

农历【马】壹玖玖零 年 冬月大初六 庚午年戊子月辛酉日
农历【猪】贰零壹捌 年 腊月大十七 戊戌年乙丑月己未日
农历【猪】贰零壹玖 年 正月大初六 己亥年丙寅月戊寅日
农历【鼠】贰零贰零 年 二月大初十 庚子年己卯月乙巳日农历庚午(马)年冬月初六
农历戊戌(猪)年腊月十七
农历己亥(猪)年正月初六
农历庚子(鼠)年二月初十冬月初六
腊月十七
正月初六
二月初十

Java公历(阳历)转换农历(阴历)工具类相关推荐

  1. python万年历差农历程序_Python实现公历(阳历)转农历(阴历)的方法示例

    本文实例讲述了Python实现公历(阳历)转农历(阴历)的方法.分享给大家供大家参考,具体如下: 两个要点: 1.公历转农历用了查表法(第126行) 2.节气用了天文法?(第176行) 运行图(背景是 ...

  2. 阳历日期转阴历工具类

    直接上代码 public class DateUtill {final private static long[] lunarInfo = new long[] { 0x04bd8, 0x04ae0, ...

  3. 【阳历转阴历工具类】

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;/*** 阴历工具类 ...

  4. 如何利用自定义函数把阳历转换成阴历

    数据库保存的是阳历日期,有时候会遇到把阳历换成阴历的需求,例如下图把阳历转换成阴历. 这个问题是我在开发报表过程中遇到的一个小需求,利用的工具是FineReport8.0版本,解决思路是首先定义一个可 ...

  5. 帆软日期格式转换_自定义函数把阳历转换成阴历

    3.1 阳历转阴历的类 FineReport 提供一个现成的农历日历工具类 SolarToLunar,该类中通过 today(int year, int month, int day)方法可将输入的年 ...

  6. 如何利用自定义函数把阳历转换成阴历 1

    数据库保存的是阳历日期,有时候会遇到把阳历换成阴历的需求,例如下图把阳历转换成阴历. 这个问题是我在开发报表过程中遇到的一个小需求,利用的工具是FineReport8.0版本,解决思路是首先定义一个可 ...

  7. 8hutool实战:ChineseDate(农历日期工具类)

    技术活,该赏 关注+一键三连(点赞,评论,收藏)再看,养成好习惯 hutool实战(带你掌握里面的各种工具)目录 万字博文教你搞懂java源码的日期和时间相关用法 用途:农历日期工具类 使用场景 农历 ...

  8. Java实现Google的S2算法工具类

    WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...

  9. (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入

    -- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...

最新文章

  1. 微信的Bug差点让我被老板炒鱿鱼!
  2. 总结MYSQL的优化
  3. Hibernate+Spring-orm的基本方法总结
  4. JAVA实现从尾到头打印链表(《剑指offer》)
  5. python学习高级篇(part1)--类属性
  6. R语言与虚拟变量模型
  7. P3586-[POI2015]LOG【线段树】
  8. 腾讯云连续三年登上KVM开源贡献榜,引领KVM技术标准!
  9. word排版案例报告_原来按下这个键,10秒EXCEL与Word格式就能互相转换,涨知识了...
  10. Ajax无刷新实现省市联动,并在回发后保留省市下拉框状态
  11. elixir 规格_六家使用Elixir的著名公司-以及为什么做出改变
  12. fig r函数_R语言图形函数par()参数应用举例.pdf
  13. python单词表首字母排序_python3 列表排序(字母顺序排序、字母相反顺序排序和倒序)...
  14. matlab 按照字符串运行,matlab中将字符串视为语句运行的方法——eval()函数
  15. linux配置ftp错误530,ubuntu16安装配置ftp服务(和530错误解决)
  16. LVS负载均衡集群——NAT
  17. 黑马程序员武汉中心——程序员面试套路集
  18. 惨遭腾讯面试官吊打高并发系统设计,回来学习2400小时后成功复仇!
  19. Mac系统显示已连接(可以打开qq)但是无法打开浏览器解决方案
  20. SpringBoot+Caffeine+Redis声明式缓存

热门文章

  1. RPGXP 使用手册
  2. 美国打车应用Lyft公布IPO招股书 预计3月底挂牌交易
  3. 网文快捕保存网页并导出chm(360浏览器)
  4. 305页18万字智慧三甲医院弱电系统设计方案完整版
  5. 机械革命s1 Synaptics TouchPad 触摸板驱动
  6. 浅谈exp与expdp的区别
  7. 【OpenSourceC#】PureMVC
  8. py学习9——linux常见指令
  9. printf格式输出数字,位数不够前面补0,适用与输出编号
  10. Sweet Home 3D软件简单使用教程。