/*
* Get from:
* https://code.google.com/p/android-project-sse-ustc/
*
* Licensed under the Apache License, Version 2.0
*
* modified by zzz
*
*/
package edu.bupt.calendar;
import java.util.Date;
public final class Lunar {
private static int monCyl;
private static int dayCyl;
private static int yearCyl;
private static int year;
private static int month;
private static int day;
/** zzz */
private static int syear;
private static int smonth;
private static int sday;
private static boolean isSetShowLunar = true;
private static boolean isLeap;
private static int[] lunarInfo = { 19416, 19168, 42352, 21717, 53856,
55632, 91476, 22176, 39632, 21970, 19168, 42422, 42192, 53840,
119381, 46400, 54944, 44450, 38320, 84343, 18800, 42160, 46261,
27216, 27968, 109396, 11104, 38256, 21234, 18800, 25958, 54432,
59984, 28309, 23248, 11104, 100067, 37600, 116951, 51536, 54432,
120998, 46416, 22176, 107956, 9680, 37584, 53938, 43344, 46423,
27808, 46416, 86869, 19872, 42448, 83315, 21200, 43432, 59728,
27296, 44710, 43856, 19296, 43748, 42352, 21088, 62051, 55632,
23383, 22176, 38608, 19925, 19152, 42192, 54484, 53840, 54616,
46400, 46496, 103846, 38320, 18864, 43380, 42160, 45690, 27216,
27968, 44870, 43872, 38256, 19189, 18800, 25776, 29859, 59984,
27480, 21952, 43872, 38613, 37600, 51552, 55636, 54432, 55888,
30034, 22176, 43959, 9680, 37584, 51893, 43344, 46240, 47780,
44368, 21977, 19360, 42416, 86390, 21168, 43312, 31060, 27296,
44368, 23378, 19296, 42726, 42208, 53856, 60005, 54576, 23200,
30371, 38608, 19415, 19152, 42192, 118966, 53840, 54560, 56645,
46496, 22224, 21938, 18864, 42359, 42160, 43600, 111189, 27936,
44448 };
private static String[] Gan = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛",
"壬", "癸" };
private static String[] Zhi = { "子", "丑", "寅", "卯", "辰", "巳", "午", "未",
"申", "酉", "戌", "亥" };
private static String[] Animals = { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊",
"猴", "鸡", "狗", "猪" };
private static String[] nStr1 = { "日", "一", "二", "三", "四", "五", "六", "七",
"八", "九", "十" };
private static String[] nStr2 = { "初", "十", "廿", "卅", " " };
private static String[] monthNong = { "正", "正", "二", "三", "四", "五", "六",
"七", "八", "九", "十", "十一", "十二" };
private static String[] yearName = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
"柒", "捌", "玖" };
private static String cDay(int d) {
String s;
switch (d) {
case 10:
s = "初十";
break;
case 20:
s = "二十";
break;
case 30:
s = "三十";
break;
default:
s = nStr2[(d / 10)];
s = s + nStr1[(d % 10)];
}
return s;
}
private static String cyclical(int num) {
return Gan[(num % 10)] + Zhi[(num % 12)];
}
private static String cYear(int y) {
String s = "";
while (y > 0) {
int d = y % 10;
y = (y - d) / 10;
s = yearName[d] + s;
}
return s;
}
public static int getDay() {
return day;
}
private static int getDayCyl() {
return dayCyl;
}
public static boolean getIsBig() {
return monthDays(getYear(), getMonth()) != 29;
}
public static boolean getIsLeap() {
return isLeap;
}
public static void setLunar(int year, int month, int day) {
if(!isSetShowLunar) {
return;
}
syear = year;
smonth = month;
sday = day;
Date sDObj = new Date(syear - 1900, smonth, sday);
Lunar1(sDObj);
}
public static String getLunar() {
if(!isSetShowLunar) {
return "";
}
int sy = (year - 4) % 12;
String s = "农历 【" + Animals[sy] + "】" + cYear(getYear()) + "年" + " ";
s = s + ((getIsLeap()) ? "闰" : "") + monthNong[getMonth()] + "月"
+ ((!getIsBig()) ? "小" : "大");
s = s + cDay(getDay()) + " ";
s = s + cyclical(getYearCyl()) + "年" + cyclical(getMonCyl()) + "月"
+ cyclical(getDayCyl()) + "日";
return s;
}
private static int getMonCyl() {
return monCyl;
}
public static int getMonth() {
return month;
}
public static String getLunarDay() {
if(!isSetShowLunar) {
return "";
}
return cDay(getDay());
}
public static String getLunarDayForDisplay() {
if(!isSetShowLunar) {
return "";
}
String dayName = "";
dayName = Festival.showSFtv(smonth, sday);
dayName = Festival.showLFtv(month, day, monthDays(year, month));
// 初一
if (getDay() == 1 && dayName == "") {
return getLunarMonth();
}
// 节假日
if (dayName != "")
return dayName;
// 平时
return cDay(getDay());
}
public static String getLunarWithComma() {
if(!isSetShowLunar) {
return "";
}
return " , " + getLunarMonth() + getLunarDay();
}
public static String getLunarMonth() {
if(!isSetShowLunar) {
return "";
}
return monthNong[getMonth()] + "月";
}
public static String getLunarYear() {
if(!isSetShowLunar) {
return "";
}
int animalYear = (year - 4) % 12;
String lunarYear = cyclical(yearCyl) + "年【" + Animals[animalYear]
+ "年】";
return lunarYear;
}
public static int getYear() {
return year;
}
private static int getYearCyl() {
return yearCyl;
}
private static int leapDays(int y) {
if (leapMonth(y) != 0) {
return ((lunarInfo[(y - 1900)] & 0x10000) == 0) ? 29 : 30;
}
return 0;
}
private static int leapMonth(int y) {
return lunarInfo[(y - 1900)] & 0xF;
}
private static void Lunar1(Date objDate) {
int i;
int leap = 0;
int temp = 0;
Date baseDate = new Date(0, 0, 31);
int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000L);
dayCyl = offset + 40;
monCyl = 14;
for (i = 1900; (i < 2050) && (offset > 0); ++i) {
temp = lYearDays(i);
offset -= temp;
monCyl += 12;
}
if (offset < 0) {
offset += temp;
--i;
monCyl -= 12;
}
year = i;
yearCyl = i - 1864;
leap = leapMonth(i);
isLeap = false;
for (i = 1; (i < 13) && (offset > 0); ++i) {
if ((leap > 0) && (i == leap + 1) && (!isLeap)) {
--i;
isLeap = true;
temp = leapDays(year);
} else {
temp = monthDays(year, i);
}
if ((isLeap) && (i == leap + 1)) {
isLeap = false;
}
offset -= temp;
if (isLeap)
continue;
monCyl += 1;
}
if ((offset == 0) && (leap > 0) && (i == leap + 1)) {
if (isLeap) {
isLeap = false;
} else {
isLeap = true;
--i;
monCyl -= 1;
}
}
if (offset < 0) {
offset += temp;
--i;
monCyl -= 1;
}
month = i;
day = offset + 1;
}
private static int lYearDays(int y) {
int sum = 348;
for (int i = 32768; i > 8; i >>= 1) {
sum += (((lunarInfo[(y - 1900)] & i) == 0) ? 0 : 1);
}
return sum + leapDays(y);
}
private static int monthDays(int y, int m) {
return ((lunarInfo[(y - 1900)] & 65536 >> m) == 0) ? 29 : 30;
}
/** zzz */
public static void setShowLunch(boolean b) {
// TODO
isSetShowLunar = b;
}
}