package util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
/**
*
* 该工具类实现公历与农历之间的相互转换
* @author dsltyyz
* @time 2015-4-8 17:05:11
* @qq 278750600
* @email 13684008780@163.com
* @version 1.0.0
* @description 根据php公历与农历之间的相互转换
*/
public class Lunar {
//最小年份
private static final int MIN_YEAR = 1891;
//最大年份
private static final int MAX_YEAR = 2100;
//LUNAR 计算参数 {闰月, 每年农历开始月份, 日期, 农历月份天数(转二进制 +对应相加29天)}
private static final int[][] LUNAR_INFO = {
{0,2,9,21936},{6,1,30,9656},{0,2,17,9584},{0,2,6,21168},{5,1,26,43344},{0,2,13,59728},
{0,2,2,27296},{3,1,22,44368},{0,2,10,43856},{8,1,30,19304},{0,2,19,19168},{0,2,8,42352},
{5,1,29,21096},{0,2,16,53856},{0,2,4,55632},{4,1,25,27304},{0,2,13,22176},{0,2,2,39632},
{2,1,22,19176},{0,2,10,19168},{6,1,30,42200},{0,2,18,42192},{0,2,6,53840},{5,1,26,54568},
{0,2,14,46400},{0,2,3,54944},{2,1,23,38608},{0,2,11,38320},{7,2,1,18872},{0,2,20,18800},
{0,2,8,42160},{5,1,28,45656},{0,2,16,27216},{0,2,5,27968},{4,1,24,44456},{0,2,13,11104},
{0,2,2,38256},{2,1,23,18808},{0,2,10,18800},{6,1,30,25776},{0,2,17,54432},{0,2,6,59984},
{5,1,26,27976},{0,2,14,23248},{0,2,4,11104},{3,1,24,37744},{0,2,11,37600},{7,1,31,51560},
{0,2,19,51536},{0,2,8,54432},{6,1,27,55888},{0,2,15,46416},{0,2,5,22176},{4,1,25,43736},
{0,2,13,9680},{0,2,2,37584},{2,1,22,51544},{0,2,10,43344},{7,1,29,46248},{0,2,17,27808},
{0,2,6,46416},{5,1,27,21928},{0,2,14,19872},{0,2,3,42416},{3,1,24,21176},{0,2,12,21168},
{8,1,31,43344},{0,2,18,59728},{0,2,8,27296},{6,1,28,44368},{0,2,15,43856},{0,2,5,19296},
{4,1,25,42352},{0,2,13,42352},{0,2,2,21088},{3,1,21,59696},{0,2,9,55632},{7,1,30,23208},
{0,2,17,22176},{0,2,6,38608},{5,1,27,19176},{0,2,15,19152},{0,2,3,42192},{4,1,23,53864},
{0,2,11,53840},{8,1,31,54568},{0,2,18,46400},{0,2,7,46752},{6,1,28,38608},{0,2,16,38320},
{0,2,5,18864},{4,1,25,42168},{0,2,13,42160},{10,2,2,45656},{0,2,20,27216},{0,2,9,27968},
{6,1,29,44448},{0,2,17,43872},{0,2,6,38256},{5,1,27,18808},{0,2,15,18800},{0,2,4,25776},
{3,1,23,27216},{0,2,10,59984},{8,1,31,27432},{0,2,19,23232},{0,2,7,43872},{5,1,28,37736},
{0,2,16,37600},{0,2,5,51552},{4,1,24,54440},{0,2,12,54432},{0,2,1,55888},{2,1,22,23208},
{0,2,9,22176},{7,1,29,43736},{0,2,18,9680},{0,2,7,37584},{5,1,26,51544},{0,2,14,43344},
{0,2,3,46240},{4,1,23,46416},{0,2,10,44368},{9,1,31,21928},{0,2,19,19360},{0,2,8,42416},
{6,1,28,21176},{0,2,16,21168},{0,2,5,43312},{4,1,25,29864},{0,2,12,27296},{0,2,1,44368},
{2,1,22,19880},{0,2,10,19296},{6,1,29,42352},{0,2,17,42208},{0,2,6,53856},{5,1,26,59696},
{0,2,13,54576},{0,2,3,23200},{3,1,23,27472},{0,2,11,38608},{11,1,31,19176},{0,2,19,19152},
{0,2,8,42192},{6,1,28,53848},{0,2,15,53840},{0,2,4,54560},{5,1,24,55968},{0,2,12,46496},
{0,2,1,22224},{2,1,22,19160},{0,2,10,18864},{7,1,30,42168},{0,2,17,42160},{0,2,6,43600},
{5,1,26,46376},{0,2,14,27936},{0,2,2,44448},{3,1,23,21936},{0,2,11,37744},{8,2,1,18808},
{0,2,19,18800},{0,2,8,25776},{6,1,28,27216},{0,2,15,59984},{0,2,4,27424},{4,1,24,43872},
{0,2,12,43744},{0,2,2,37600},{3,1,21,51568},{0,2,9,51552},{7,1,29,54440},{0,2,17,54432},
{0,2,5,55888},{5,1,26,23208},{0,2,14,22176},{0,2,3,42704},{4,1,23,21224},{0,2,11,21200},
{8,1,31,43352},{0,2,19,43344},{0,2,7,46240},{6,1,27,46416},{0,2,15,44368},{0,2,5,21920},
{4,1,24,42448},{0,2,12,42416},{0,2,2,21168},{3,1,22,43320},{0,2,9,26928},{7,1,29,29336},
{0,2,17,27296},{0,2,6,44368},{5,1,26,19880},{0,2,14,19296},{0,2,3,42352},{4,1,24,21104},
{0,2,10,53856},{8,1,30,59696},{0,2,18,54560},{0,2,7,55968},{6,1,27,27472},{0,2,15,22224},
{0,2,5,19168},{4,1,25,42216},{0,2,12,42192},{0,2,1,53584},{2,1,21,55592},{0,2,9,54560}
};
//日期汉字
private static final String[] DATE = {"", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
//月份汉字
private static final String[] MONTH = {"", "正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "冬月", "腊月"};
//天干
private static final String[] SKY = {"庚","辛","壬","癸","甲","乙","丙","丁","戊","己"};
//地支
private static final String[] EARTH = {"申","酉","戌","亥","子","丑","寅","卯","辰","巳","午","未"};
//生肖
private static final String[] ZODIAC = {"猴","鸡","狗","猪","鼠","牛","虎","兔","龙","蛇","马","羊"};
//星座
private final static String[][] CONSTELLATION = {
{"01-20", "02-18", "1", "水瓶座"},
{"02-19", "03-20", "2", "双鱼座"},
{"03-21", "04-19", "3", "白羊座"},
{"04-20", "05-20", "4", "金牛座"},
{"05-21", "06-21", "5", "双子座"},
{"06-22", "07-22", "6", "巨蟹座"},
{"07-23", "08-22", "7", "狮子座"},
{"08-23", "09-22", "8", "处女座"},
{"09-23", "10-23", "9", "天秤座"},
{"10-24", "11-22", "10", "天蝎座"},
{"11-23", "12-21", "11", "射手座"},
{"12-22", "01-19", "12", "摩羯座"}
};
/**
* 字符串得到日期
* @param date
* @return Date
*/
private static Date getDate(String date) {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date dd = null;
try {
dd = format.parse(date);
} catch (Exception e) {
e.printStackTrace();
}
return dd;
}
/**
* 获取最近生日距离现在多少天
* @param birthday 出生年月
* @param flag true 获取星座id false 获取星座名称
* @return String
*/
private static String getConstellation(String birthday, boolean flag) {
String year = birthday.substring(0, 4);
String result = null;
for (String[] constellation : CONSTELLATION) {
if (!constellation[2].equals("12")) {
if (!getDate(birthday).before(getDate(year+"-"+constellation[0])) && !getDate(birthday).after(getDate(year+"-"+constellation[1]))) {
result = flag ? constellation[2]:constellation[3];
}
}else{
if (!getDate(birthday).before(getDate(year+"-"+constellation[0])) || !getDate(birthday).after(getDate(year+"-"+constellation[1]))) {
result = flag ? constellation[2]:constellation[3];
}
}
}
return result;
}
/**
* 农历转公历
* @param year
* @param month 闰月该月份+1 之后的都加1
* @param day
* @return LunarEntity
* @throws ParseException
*/
private static LunarEntity convertLunarToSolar(int year, int month, int day) throws ParseException{
//超出范围
if(year>MAX_YEAR||year<MIN_YEAR){
return null;
}
int[] yearDate = LUNAR_INFO[year-MIN_YEAR];
int between = getDaysBetweenLunar(year, month, day);
Date date = getDate(year+"-"+yearDate[1]+"-"+yearDate[2]);
//注意数字越界
//date = new Date(date.getTime()+between*24*60*60*1000);//越界了
date = new Date((date.getTime()/1000+between*24*60*60)*1000);
String[] d = dateToStr(date, 1).split("-");
LunarEntity le = convertSolarToLunar(Integer.valueOf(d[0]), Integer.valueOf(d[1]), Integer.valueOf(d[2]));
return le;
}
/**
* 日期转字符串
* @param d
* @param type
* @return String
*/
private static String dateToStr(Date d, int type) {
String s = "";
SimpleDateFormat sdf = null;
switch (type) {
case 1:
sdf = new SimpleDateFormat("yyyy-MM-dd");
break;
case 2:
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
break;
case 3:
sdf =
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
util.rar (2个子文件)
Lunar.java 18KB
LunarEntity.java 3KB
共 2 条
- 1
资源评论
- yisi08272017-06-19为什么运行不了,好尴尬呀,白费了这么多积分了
多少楼台烟雨中
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功