java用map集合分别计算年月日的天干地支源码

import java.util.*;
import java.text.DateFormat;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;



class TianDi
{
public static void main(String[] args) throws ParseException
{

TianGanTable tgt = new TianGanTable();
tgt.tianDiDay("2016-9-15");
}
}

class TianGanTable
{
private static final String[] arrTian = {"甲","乙","丙","丁", "戊","己","庚","辛","壬","癸"};
private static final String[] arrDi = {"子","丑","寅","卯","辰","巳","午", "未","申","酉","戌","亥"};

private static Map tian = new HashMap();
private static Map di = new HashMap();
TianGanTable()
{
tianDiPut(tian,arrTian);
tianDiPut(di,arrDi);
}


//计算日
public static void tianDiDay(String time) throws ParseException
{

//获取日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(time);
Calendar ca = Calendar.getInstance();
ca.setTime(d);
int days = ca.get(Calendar.DAY_OF_MONTH);
int month = ca.get(Calendar.MONTH)+1;
int year = ca.get(Calendar.YEAR);
int last_year = Integer.parseInt(time.substring(2,4));//获取年的后2位
int first_year = Integer.parseInt(time.substring(0,2));//获取年的前2位

//计算年的天干地支
int indexTian = (year-3)%10; //天
int indexDi = (year-3)%12; //地
String yearOfTianDi = tian.get(indexTian)+di.get(indexDi); //得到年的天干地支

//计算日的天干地支

//日的天
int g=(int)(4*first_year+Math.floor(first_year/4)+5*last_year+Math.floor(last_year/4)+Math.floor(3*(month+1)/5)+days-3);
g = g%10;
//日的地
int i=0;
if (month%2==0)
{
i=6;
}

int z=(int)(8*first_year+Math.floor(first_year/4)+5*last_year+Math.floor(last_year/4)+Math.floor(3*(month+1)/5)+days+7+i);
z = z%12;
String c = tian.get(g)+di.get(z); //得到日的天干地支

//计算月的天干地支
String strMonth = month+"月";
String tianGanOfYear = tian.get(indexTian); //获取年的天干

//判断输入日期年的天干对应月地支的位置

Map monthTable = monthTable();
int indexOfmonth = indexOfmonthTable(tianGanOfYear);
if (monthTable.containsKey(strMonth))
{
Map stmpMonth = (Map)monthTable.get(strMonth);

System.out.println(time+"的天干地支是:"+yearOfTianDi+"年"+ " "+stmpMonth.get(indexOfmonth)+" "+c+"日");
}else{
System.out.println("输入的月份不存在");
}
}

//将天干、地支数组添加到Map集合
public static void tianDiPut(Map tiandi,String[] arr)
{

for (int i=0; i{
if (i!=arr.length-1)
{
tiandi.put(i+1,arr[i]);
}else
{
tiandi.put(0,arr[arr.length-1]);
}

}

}
//天干地支对照表,返回一个Map集合
public static Map tianDiTable()
{


Map indexTable = new HashMap();

int x = 0;
while (x<60)
{

int i = x%10;
int j = x%12;
int key = x+1;
String values = arrTian[i]+arrDi[j];
indexTable.put(key,values);

x++;
}
return indexTable;

}

//月地支表
public static Map monthTable ()
{
String[][] arr = {{"丙寅月","戊寅月","庚寅月","壬寅月","甲寅月"},
{"丁卯月","己卯月","辛卯月","癸卯月","乙卯月"},
{"戊辰月","庚辰月","壬辰月","甲辰月","丙辰月"},
{"己巳月","辛巳月","癸巳月","乙巳月","丁巳月"},
{"庚午月","壬午月","甲午月","丙午月","戊午月"},
{"辛未月","癸未月","乙未月","丁未月","己未月"},
{"壬申月","甲申月","丙申月","戊申月","庚申月"},
{"癸酉月","乙酉月","丁酉月","己酉月","辛酉月"},
{"甲戌月","丙戌月","戊戌月","庚戌月","壬戌月"},
{"乙亥月","丁亥月","己亥月","辛亥月","癸亥月"},
{"丙子月","戊子月","庚子月","壬子月","甲子月"},
{"丁丑月","己丑月","辛丑月","癸丑月","乙丑月"}};
String[] monthNum = {"2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月","1月"};
Map> map = new HashMap>();

for (int i=0;i{
Map map1 = new HashMap();
for (int j=0;j{
map1.put(j+1,arr[i][j]);
}
map.put(monthNum[i],map1);

}
return map;

}
//年的天干对应月地支的位置

public static int indexOfmonthTable(String tianGanOfYear )
{


String[] tmp = {"","甲己","乙庚","丙辛","丁壬","戊癸"};
int num=0 ;
for (int i=0;i{
if (tmp[i].contains(tianGanOfYear))
{
num = i;
}
}
return num;
}

}

/*
1、 天干表{{0,"癸"},{1,"甲"},{2,"乙"},{3,"丙"},{4,"丁"}
,{5,"戊"},{6,"己"},{7,"庚"},{8,"辛"},{9,"壬"}}
2、 地支表{{0,"亥"},{1,"子"},{2,"丑"},{3,"寅"},{4,"卯"},{5,"辰"}
,{6,"巳"},{7,"午"},{8,"未"},{9,"申"},{10,"酉"},{11,"戌"}}

3、 年的天干地支算法:
天干:根据(公元年份-3)%10得天干
地支:根据(公元年份-3)%12得地支

4、从已知日期计算干支纪日的公式为:

G=4C+[C/4]+5y+[y/4]+[3*(M+1)/5]+d-3

Z=8C+[C/4]+5y+[y/4]+[3*(M+1)/5]+d+7+i

其中C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月按上一年的13月和14月来算。奇数月i=0,偶数月i=6。G除以10的余数是天干,Z除以12的余数是地支。

计算时带[]的数表示取整。

例如:查2006年4月1日的干支日。将数值代入计算公式。G=4*20+[20/4]+5*06+[06/4]+[3*(4+1)/5]+1-3=197

除以10余数为7,天干的第7位是‘庚’。Z=8*20+[20/4

]+5*06+[06/4]+[3*(4+1)/5]+1+7+6=213

除以12余数为9,地支的第9位是‘申’。

答案是:2006年4月1日的干支日是庚申日

[1==甲子,2==乙丑,3==丙寅,4==丁卯,5==戊辰,6==己巳,7==庚午,8==辛未,9==壬申,10==癸酉,11==甲戌,
12==乙亥,13==丙子,14==丁丑,15==戊寅,16==己卯,17==庚辰,18==辛巳,19==壬午,20==癸未,21==甲申,
22==乙酉,23==丙戌,24==丁亥,25==戊子,26==己丑,27==庚寅,28==辛卯,29==壬辰,30==癸巳,31==甲午,
32==乙未,33==丙申,34==丁酉,35==戊戌,36==己亥,37==庚子,38==辛丑,39==壬寅,40==癸卯,41==甲辰,
42==乙巳,43==丙午,44==丁未,45==戊申,46==己酉,47==庚戌,48==辛亥,49==壬子,50==癸丑,51==甲寅,
52==乙卯,53==丙辰,54==丁巳,55==戊午,56==己未,57==庚申,58==辛酉,59==壬戌,60==癸亥,]


G=4C+[C/4]+5y+[y/4]+[3*(M+1)/5]+d-3

Z=8C+[C/4]+5y+[y/4]+[3*(M+1)/5]+d+7+i

其中C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月按上一年的13月和14月来算。
奇数月i=0,偶数月i=6。G除以10的余数是天干,Z除以12的余数是地支。
计算时带[]的数表示取整。

5、 月的天干地支查表法:

甲或己年 乙或庚年 丙或辛年 丁或壬年 戊或癸年

寅月 立春—惊蛰 雨水 正月 2月 丙寅月 戊寅月 庚寅月 壬寅月 甲寅月

卯月 惊蛰—清明 春分 二月 3月 丁卯月 己卯月 辛卯月 癸卯月 乙卯月

辰月 清明—立夏 谷雨 三月 4月 戊辰月 庚辰月 壬辰月 甲辰月 丙辰月

巳月 立夏—芒种 小满 四月 5月 己巳月 辛巳月 癸巳月 乙巳月 丁巳月

午月 芒种—小暑 夏至 五月 6月 庚午月 壬午月 甲午月 丙午月 戊午月

未月 小暑—立秋 大暑 六月 7月 辛未月 癸未月 乙未月 丁未月 己未月

申月 立秋—白露 处暑 七月 8月 壬申月 甲申月 丙申月 戊申月 庚申月

酉月 白露—寒露 秋分 八月 9月 癸酉月 乙酉月 丁酉月 己酉月 辛酉月

戌月 寒露—立冬 霜降 九月 10月 甲戌月 丙戌月 戊戌月 庚戌月 壬戌月

亥月 立冬—大雪 小雪 十月 11月 乙亥月 丁亥月 己亥月 辛亥月 癸亥月

子月 大雪—小寒 冬至 十一月 12月 丙子月 戊子月 庚子月 壬子月 甲子月

丑月 小寒—立春 大寒 十二月 1月 丁丑月 己丑月 辛丑月 癸丑月 乙丑月*/


相关文档
最新文档