当前位置:   article > 正文

java 农历算法_中国农历算法java实现

java农历算法

/**

* 中国农历算法 - 实用于公历 1901 年至 2100 年之间的 200 年

*/

import java.text.*;

import java.util.*;

class ChineseCalendarGB {

private int gregorianYear;

private int gregorianMonth;

private int gregorianDate;

private boolean isGregorianLeap;

private int dayOfYear;

private int dayOfWeek; // 周日一星期的第一天

private int chineseYear;

private int chineseMonth; // 负数表示闰月

private int chineseDate;

private int sectionalTerm;

private int principleTerm;

private static char[] daysInGregorianMonth =

{31,28,31,30,31,30,31,31,30,31,30,31};

private static String[] stemNames =

{"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};

private static String[] branchNames =

{"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};

private static String[] animalNames =

{"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};

public static void main(String[] arg) {

ChineseCalendarGB c = new ChineseCalendarGB();

String cmd = "day";

int y = 1901;

int m = 1;

int d = 1;

if (arg.length>0) cmd = arg[0];

if (arg.length>1) y = Integer.parseInt(arg[1]);

if (arg.length>2) m = Integer.parseInt(arg[2]);

if (arg.length>3) d = Integer.parseInt(arg[3]);

c.setGregorian(y,m,d);

c.computeChineseFields();

c.computeSolarTerms();

if (cmd.equalsIgnoreCase("year")) {

String[] t = c.getYearTable();

for (int i=0; i

} else if (cmd.equalsIgnoreCase("month")) {

String[] t = c.getMonthTable();

for (int i=0; i

} else {

System.out.println(c.toString());

}

}

public ChineseCalendarGB() {

setGregorian(1901,1,1);

}

public void setGregorian(int y, int m, int d) {

gregorianYear = y;

gregorianMonth = m;

gregorianDate = d;

isGregorianLeap = isGregorianLeapYear(y);

dayOfYear = dayOfYear(y,m,d);

dayOfWeek = dayOfWeek(y,m,d);

chineseYear = 0;

chineseMonth = 0;

chineseDate = 0;

sectionalTerm = 0;

principleTerm = 0;

}

public static boolean isGregorianLeapYear(int year) {

boolean isLeap = false;

if (year%4==0) isLeap = true;

if (year%100==0) isLeap = false;

if (year%400==0) isLeap = true;

return isLeap;

}

public static int daysInGregorianMonth(int y, int m) {

int d = daysInGregorianMonth[m-1];

if (m==2 && isGregorianLeapYear(y)) d++; // 公历闰年二月多一天

return d;

}

public static int dayOfYear(int y, int m, int d) {

int c = 0;

for (int i=1; i

c = c + daysInGregorianMonth(y,i);

}

c = c + d;

return c;

}

public static int dayOfWeek(int y, int m, int d) {

int w = 1; // 公历一年一月一日是星期一,所以起始值为星期日

y = (y-1)%400 + 1; // 公历星期值分部 400 年循环一次

int ly = (y-1)/4; // 闰年次数

ly = ly - (y-1)/100;

ly = ly + (y-1)/400;

int ry = y - 1 - ly; // 常年次数

w = w + ry; // 常年星期值增一

w = w + 2*ly; // 闰年星期值增二

w = w + dayOfYear(y,m,d);

w = (w-1)%7 + 1;

return w;

}

private static char[] chineseMonths = {

// 农历月份大小压缩表,两个字节表示一年。两个字节共十六个二进制位数,

// 前四个位数表示闰月月份,后十二个位数表示十二个农历月份的大小。

0x00,0x04,0xad,0x08,0x5a,0x01,0xd5,0x54,0xb4,0x09,0x64,0x05,0x59,0x45,

0x95,0x0a,0xa6,0x04,0x55,0x24,0xad,0x08,0x5a,0x62,0xda,0x04,0xb4,0x05,

0xb4,0x55,0x52,0x0d,0x94,0x0a,0x4a,0x2a,0x56,0x02,0x6d,0x71,0x6d,0x01,

0xda,0x02,0xd2,0x52,0xa9,0x05,0x49,0x0d,0x2a,0x45,0x2b,0x09,0x56,0x01,

0xb5,0x20,0x6d,0x01,0x59,0x69,0xd4,0x0a,0xa8,0x05,0xa9,0x56,0xa5,0x04,

0x2b,0x09,0x9e,0x38,0xb6,0x08,0xec,0x74,0x6c,0x05,0xd4,0x0a,0xe4,0x6a,

0x52,0x05,0x95,0x0a,0x5a,0x42,0x5

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号