本文内容来源于 https://blog.csdn.net/qq_27631797/article/details/78709181,这里只是稍作调整,随后做进一步优化。

代码如下:

public class LunarUtil {private static final String[] CHINESE_NUM = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"};private static final long[] LUNAR_CODE = 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};private int mYear;private int mMonth;private int mDay;private boolean mLeap;/*** constructor** @param cal Calendar*/public LunarUtil(Calendar cal) {@SuppressWarnings("unused")int yearCyl, monCyl, dayCyl;int leapMonth = 0;Date baseDate = null;try {SimpleDateFormat chineseDateFormat = new SimpleDateFormat("yyyy-MM-dd");baseDate = chineseDateFormat.parse("1900-1-31");} catch (ParseException e) {//throw e;}// 求出和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;}// 农历年份mYear = iYear;yearCyl = iYear - 1864;// 闰哪个月,1-12leapMonth = leapMonth(iYear);mLeap = false;// 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天int iMonth, daysOfMonth = 0;for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {// 闰月if (leapMonth > 0 && iMonth == (leapMonth + 1) && !mLeap) {--iMonth;mLeap = true;daysOfMonth = leapDays(mYear);} else {daysOfMonth = monthDays(mYear, iMonth);}offset -= daysOfMonth;// 解除闰月if (mLeap && iMonth == (leapMonth + 1)) {mLeap = false;}if (!mLeap) {monCyl++;}}// offset为0时,并且刚才计算的月份是闰月,要校正if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {if (mLeap) {mLeap = false;} else {mLeap = true;--iMonth;--monCyl;}}// offset小于0时,也要校正if (offset < 0) {offset += daysOfMonth;--iMonth;--monCyl;}mMonth = iMonth;mDay = offset + 1;}/*** 传回农历 y年的总天数** @param y* @return*/final private static int yearDays(int y) {int i, sum = 348;for (i = 0x8000; i > 0x8; i >>= 1) {if ((LUNAR_CODE[y - 1900] & i) != 0) {sum += 1;}}return (sum + leapDays(y));}/*** 传回农历 y年闰月的天数*/final private static int leapDays(int y) {if (leapMonth(y) != 0) {if ((LUNAR_CODE[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) (LUNAR_CODE[y - 1900] & 0xf);}/*** 传回农历 y年m月的总天数*/final private static int monthDays(int y, int m) {if ((LUNAR_CODE[y - 1900] & (0x10000 >> m)) == 0) {return 29;} else {return 30;}}/*** 传回干支, 0=甲子** @param num 公历日期* @return 传回干支, 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]);}/*** 获取农历日期** @param day 公历日期* @return 农历日期字符串*/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] + CHINESE_NUM[n];}}/*** 传回干支, 0=甲子*/final public String cyclicalYear() {int num = mYear - 1900 + 36;return (cyclicalm(num));}/*** 农历y年的生肖*/final public String zodiacYear() {final String[] zodiac = new String[]{"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"};return zodiac[(mYear - 4) % 12];}@Overridepublic String toString() {return cyclicalYear() + "年" + (mLeap ? "闰" : "") + CHINESE_NUM[mMonth - 1] + "月" + getChinaDayString(mDay);}
}

java 获取农历日期相关推荐

  1. java 获取阴历日期公历日期转农历日期或者阳历日期转阴历日期

    背景 项目中需要获取农历日期,展示在页面,不使用第三方工具类的情况下,直接使用原生的java api工具类开发 代码如下 package com.hidata.devops.paas;import j ...

  2. LocalDateTime工具类:根据当前、周、月、季度、半年、年等维度获取时间hutool工具包获取农历日期,生肖,传统节日

    1. 简介 Java8提供了全新的日期处理包(java.time.*),根据Java8日期新特性封装日期时间工具类LocalDateTimeUtils. 2. 工具类方法目录 说明 方法名称 当前时间 ...

  3. Java获取某个日期前后几天日期

    spark,hadoop交流群,QQ群号:521066396,欢迎加入共同学习,一起进步~ 以下是Java获取某个日期前后几天日期的代码: public static void main(String ...

  4. java 获取指定日期的前几天或后几天

    /*java获取指定日期的前几天或后几天@param datestr指定日期* @param format 日期格式* * @param flag true为获取后几天, false:为获取前几天* ...

  5. php 获取农历,PHP通过新历获取农历日期的方法

    PHP通过新历获取农历日期的方法 array(8,0,0,0,0,0,0,0,0,0,0,0,29,30,7,1), 1=>array(0,29,30,29,29,30,29,30,29,30, ...

  6. Java 获取指定日期

    Java 获取指定日期每周的第一天和最后一天 private String firstWeekDay(String days)throws Exception{ String first_day=&q ...

  7. java获取指定日期的所在周的第一天(周一)

    java获取指定日期的所在周的第一天(周一) private static void getWeekByDate(Date time) {SimpleDateFormat sdf = new Simp ...

  8. JAVA获取指定日期

    JAVA获取指定日期 获取前/后(月.天.小时)时间 获取上月: 得到一个月最后一天日期(31/30/29/28) 获取本日日期 获取本周一日期 获取本周日日期 获取本月日期 java项目中经常需要用 ...

  9. java 获取指定日期下月的第一天

    java 获取指定日期的下月的第一天时多少:如传入20210323,则返回20210401,如传入20211221,则返回20220101 public static String getFirstD ...

  10. js获取农历日期、节气等

    js获取农历日期.节气等信息的插件–solarlunar https://github.com/yize/solarlunar#readme 点我直达 npm install solarlunar / ...

最新文章

  1. 使用Docker部署Node.js中的Vue项目
  2. Ubuntu 12.04下安装Oracle Express 11gR2
  3. 《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一第6章 让场景更逼真——光照效果...
  4. WPF的网易云音乐页面
  5. 信号与系统——四对时域频域对应关系
  6. 微信分享appID注册一次后即绑定该应用?
  7. chm之已取消到该网页的导航解决办法
  8. Win10的Linux子系统Ubuntu安装图形界面
  9. 数据库公共字段自动填充
  10. Linus Torvalds 发布 Linux Kernel 5.9,引入各种新功能与改进
  11. Excel如何将工作表按数值大小排序
  12. 记录一个问题:RJ45灯,绿灯与黄灯同时闪烁,连接出问题
  13. MATLAB函数合辑
  14. 基于云存储技术的仓储管理系统
  15. SQL语句中的数学函数
  16. 云计算时代-虚拟云桌面,实现随时随地办公
  17. 建立高效的测试团队 (转自关河)
  18. 获取固有节假日的时间戳数组 (美国节假日)
  19. 什么是 AirServer?2023最新版本有哪些新功能
  20. 【机器学习】基于天气数据集的XGBoost分类与预测

热门文章

  1. Windows Live SkyDrive 介绍之图片存储:摄影师在线图片展示的新选择
  2. spring boot 在fastdfs文件上传大小限制
  3. 小迪安全第10天 信息收集,资产监控拓展
  4. html响应式布局手机屏幕导航条,美图响应式布局导航条效果
  5. x99芯片组 服务器,X99芯片组详情:不兼容的LGA2011-3插槽,6个USB 3.0接口
  6. 英特尔cpu与主板芯片组对应关系(包含12代)
  7. 谷歌浏览器 Cookie 设置
  8. 爱荷华大学计算机科学专业,2015 U.S News计算机科学专业排名(不知道有没有伙伴在找)...
  9. python syntax error_python提示Syntax Error报错解决教程
  10. python编写篮球_资深程序员教你,利用python预测NBA比赛结果,太精彩了