import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** 阴历工具类*/
public class Lunar {private int year;private int month;private int day;private boolean leap;final static String chineseNumber[] ={ "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊" };final static String Big_Or_Small[] ={ "大", "小", "大", "小", "大", "小", "大", "大", "小", "大", "小", "大" };private String[] LunarHolDayName ={ "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至","小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪","冬至" };static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(" yyyy年MM月dd日 ");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 };/*** 传回农历 y年的总天数* @param y* @return*/final private static int yearDays(int y){int i, sum = 348;for (i = 0x8000; i > 0x8; i >>= 1){if ((lunarInfo[y - 1900] & i) != 0){sum += 1;}}return (sum + leapDays(y));}/*** 传回农历 y年闰月的天数* @param y* @return*/final private static int leapDays(int y){if (leapMonth(y) != 0){if ((lunarInfo[y - 1900] & 0x10000) != 0){return 30;} else{return 29;}} else{return 0;}}/*** 传回农历 y年闰哪个月 1-12 , 没闰传回 0* @param y* @return*/final private static int leapMonth(int y){return (int) (lunarInfo[y - 1900] & 0xf);}/*** 传回农历 y年m月的总天数* @param y* @param m* @return*/final private static int monthDays(int y, int m){if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0){return 29;} else{return 30;}}/*** 传回农历 y年的生肖* @return*/final public String animalsYear(){final String[] Animals = new String[]{ "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };return Animals[(year - 4) % 12];}/*** 传入 月日的offset 传回干支, 0=甲子* @param num* @return*/final private static String cyclicalm(int num){final String[] Gan = new String[]{ "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };final String[] Zhi = new String[]{ "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };return (Gan[num % 10] + Zhi[num % 12]);}/*** 传入 offset 传回干支, 0=甲子* @return*/final public String cyclical(){int num = year - 1900 + 36;return (cyclicalm(num));}/*** 默认今天*/public Lunar() {this(new Date());}/** *//*** 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数 ? monCyl4:从1900年1月31日以来,闰月数* dayCyl5:与1900年1月31日相差的天数,再加40 ?** @param date* @return*/public Lunar(Date date){int leapMonth;Date baseDate = null;try{baseDate = chineseDateFormat.parse(" 1900年1月31日 ");}catch (ParseException e){e.printStackTrace(); // To change body of catch statement use// Options | File Templates.}// 求出和1900年1月31日相差的天数int offset = (int) ((date.getTime() - baseDate.getTime()) / 86400000L);// 用offset减去每农历年的天数// 计算当天是农历第几天// i最终结果是农历的年份// offset是当年的第几天int iYear, daysOfYear = 0;for (iYear = 1900; iYear < 2050 && offset > 0; iYear++){daysOfYear = yearDays(iYear);offset -= daysOfYear;}if (offset < 0){offset += daysOfYear;iYear--;}// 农历年份year = iYear;// 闰哪个月,1-12leapMonth = leapMonth(iYear);leap = false;// 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天int iMonth, daysOfMonth = 0;for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++){// 闰月if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap){--iMonth;leap = true;daysOfMonth = leapDays(year);}else{daysOfMonth = monthDays(year, iMonth);}offset -= daysOfMonth;// 解除闰月if (leap && iMonth == (leapMonth + 1)){leap = false;}}// offset为0时,并且刚才计算的月份是闰月,要校正if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1){if (leap){leap = false;}else{leap = true;--iMonth;}}// offset小于0时,也要校正if (offset < 0){offset += daysOfMonth;--iMonth;}month = iMonth;day = offset + 1;}public static String getChinaDayString(int day){String chineseTen[] ={ "初", "十", "廿", "卅" };int n = day % 10 == 0 ? 9 : day % 10 - 1;if (day > 30){return "";} else if (day == 10){return "初十";} else if (day == 20){return "二十";} else if (day == 30){return "三十";} else{return chineseTen[day / 10] + chineseNumber[n];}}@Overridepublic String toString(){return (leap ? "闰" : "") + chineseNumber[month - 1] + "月" + getChinaDayString(day);}/*** 返回阿拉伯数字的阴历日期* @return*/public String numeric_md(){String temp_day;String temp_mon;temp_mon = month < 10 ? "0" + month : "" + month;temp_day = day < 10 ? "0" + day : "" + day;return temp_mon + temp_day;}/*** 返回阴历的月份* @return*/public String get_month(){return chineseNumber[month - 1];}/*** 返回阴历的天* @return*/public String get_date(){return getChinaDayString(day);}/*** 返回的月份的大或小* @return*/public String get_Big_Or_Small(){return Big_Or_Small[month - 1];}}

【阳历转阴历工具类】相关推荐

  1. Java公历(阳历)转换农历(阴历)工具类

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

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

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

  3. 电子日历插件(阳历转阴历工具...)

    现在网络上大部分农历算法的都很少,都是百年农历算法(截止到2020年).为此从某云上找到开源大佬[Jea杨(JJonline@JJonline.Cn)]的农历算法.实际上计算阳历转农历没有直接的转换算 ...

  4. 一个阴历阳历互相转化的类(c#源码)

    最近郁闷地发现网上现有的相当一部分万年历上干支纪年的算法都是错误的.因为干支纪年是针对阴历而言的,而生肖属相又跟地支对应,所以元旦和春节之间那段时间在干支纪年法中应该归上一年,以阳历2007年2月9日 ...

  5. 阴历转阳历java_GitHub - opprime/calendarist: 一个可实现阳历、阴历、干支历间相互转换的JAVA工具...

    历法计算家,可实现阳历.阴历.干支历的相互转换 使用方法 Maven引用 org.hothub calendarist 1.0.7 功能介绍 支持1900 - 2100年份的日期转换 支持阳历日期转阴 ...

  6. Java农历(阴历)工具类

    收藏两个个农历工具类 1-------------------------------------------------------- package com.quanyu.test;import ...

  7. JS中1900-2100区间内的公历、农历互转的工具类

    说明: (1)由于博主是在Extjs项目中使用该工具类,所以这里我们用Extjs,但是本质上就是js. (2)该工具类是实际项目中一直在用的,至于实际出处是哪不得而知,博主只是针对自己的整理然后觉得日 ...

  8. Android移动开发-Android开发日历时常用的农历和公历换算代码工具类

    下面是与Android开发日历时常用的有关农历计算.公历计算.二十四气节相关的代码工具类的代码. Constant.java逻辑代码如下: package com.fukaimei.calendar. ...

  9. 天干地支 工具类java_java日期工具类DateUtil-续二

    该版本是一次较大的升级,农历相比公历复杂太多(真佩服古人的智慧),虽然有规律,但涉及到的取舍.近似的感念太多,况且本身的概念就已经很多了,我在网上也是查阅了很多的资料,虽然找到一些计算的方法,但都有些 ...

最新文章

  1. 深度学习中的Normalization模型(附实例公式)
  2. 膝盖中了一箭之康复篇-第五个月
  3. ADSL(Asymmetric Digital Subscriber Loop)技术
  4. C/C++冷门知识点你知道多少呢?
  5. VMware Workstation Pro 无法在Windows 上运行的 解决办法
  6. AttributeError:type object ‘TFLiteConverterV2 ‘has no attribute ‘form_keras_model_file ‘
  7. 详解第一个CUDA程序kernel.cu
  8. ppt地图分布图一块一块的怎么做_没想到PPT还能这样做动态地图,实在是太炫酷了,用了再也离不开...
  9. android edittext不可复制_【EditText】Android设置EditText不可编辑 | 学步园
  10. 【Excel 教程系列第 5 篇】查找重复值
  11. zblog首页模板修改php,zblog主题模板文件的修改办法
  12. 【数据分析 —— 认识数据】
  13. 美国华盛顿州立大学计算机排名,2020年华盛顿州立大学排名TFE Times美国最佳计算机科学硕士专业排名第38...
  14. HTML简单表格的制作
  15. 运维工程师手把手教你提高网站的安全性
  16. 四步学会使用ECharts做图
  17. 单片机可以替代PLC吗?
  18. 本科课程【数据结构与算法】实验1——线性表的顺序表示及插入、删除操作(C++实现)
  19. 第二章 进程管理(3)——进程同步
  20. 【QT Graphics/View】自定义动态矩形框DyRectangle

热门文章

  1. 人肉反编译使用yield关键字的方法
  2. Prometheus学习系列(十五)之预警规则
  3. Godot Engine:Blender模型导入Godot自动生成的场景结构
  4. “泰迪杯”挑战赛 - 基于非侵入式负荷检测与分解针对日常电器的电力数据挖掘
  5. 26岁离开谷歌,女朋友一个建议助他开发出10亿美元App
  6. 如何让联系人头像显示联系人姓名的第一个汉字
  7. 虎牙安卓Android最新的,虎牙安卓版
  8. 用记事本怎么在html页面中加入个按钮,,页面提示5次你干啥点我,用word制作网页...
  9. java开发台球的图片_Java模拟桌球打击处理及绘制
  10. js 数组根据特定规则排序