您的位置:首页 > 编程语言 > Java开发

一个比较综合的阴历和阳历的java源程序

2009-11-16 21:52 337 查看
import java.text.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.util.*;
import javax.swing.*;
public class TestCenter extends JFrame implements ActionListener
{

public static void main(String[] args)
{
SwingConsole.run(new TestCenter(), 525, 525);
}

public TestCenter()
{
setTitle(" 阴历及节日软件 2008 beta1");
setIconImage(this.getToolkit().createImage("title.gif"));
setResizable(false);
calendar = Calendar.getInstance();
today = calendar.get(Calendar.DAY_OF_MONTH);
panel_Header = initializtion_Header();
panel_Week = initializtion_Week();
panel_Calendar = initializtion_Calendar();
setLayout(null);
setBounds(185, 125, 0, 0);
add(panel_Header);
panel_Calendar.setBounds(0, 0, 525, 45);
add(panel_Week);
panel_Week.setBounds(0, 45, 525, 35);
add(panel_Calendar);
panel_Calendar.setBounds(0, 80, 525, 415);
initializtion_Data(calendar);

}

private JPanel initializtion_Header()
{// 显示表头的panel

JPanel panel = new JPanel();
year_box = new JComboBox();
month_box = new JComboBox();
cross = new JRadioButton("c", false);
cross.addActionListener(new LookAndFeel_Listener());
system = new JRadioButton("s", false);
system.addActionListener(new LookAndFeel_Listener());
motif = new JRadioButton("m", false);
motif.addActionListener(new LookAndFeel_Listener());
feel_group = new ButtonGroup();
show_help = new JButton("说 明");
show_help.addActionListener(new Statement_Listener());

feel_group.add(cross);
feel_group.add(system);
feel_group.add(motif);
panel.setBorder(new EtchedBorder(5, Color.red, Color.BLUE));
JLabel year_l = new JLabel("请您选择年份: ", JLabel.RIGHT);
JLabel month_l = new JLabel("月份: ", JLabel.RIGHT);
panel.setLayout(null);
panel.setSize(525, 45);

for (int i = 1900; i < 2050; i++)
year_box.addItem("" + i);
for (int j = 1; j <= 12; j++)
month_box.addItem("" + j);

year_box.setSelectedIndex(calendar.get(Calendar.YEAR) - 1900);
month_box.setSelectedIndex(calendar.get(Calendar.MONTH));
panel.add(year_l);
year_l.setBounds(0, 10, 95, 25);
panel.add(year_box);
year_box.setBounds(100, 10, 65, 25);
panel.add(month_l);
month_l.setBounds(160, 10, 45, 25);
panel.add(month_box);
month_box.setBounds(210, 10, 45, 25);
JLabel look_feel = new JLabel("外观:", JLabel.RIGHT);
panel.add(look_feel);
look_feel.setBounds(290 - 38, 10, 38, 25);
panel.add(cross);
cross.setBounds(290, 10, 38, 25);
panel.add(system);
system.setBounds(325, 10, 32, 25);
panel.add(motif);
motif.setBounds(355, 10, 38, 25);
panel.add(show_help);
show_help.setBounds(400, 10, 65, 25);
show_help.setBorder(new EmptyBorder(0, 0, 0, 0));
show_help.setBackground(Color.getHSBColor(23, 21, 10));
year_box.addActionListener(this);
month_box.addActionListener(this);
return panel;
}

private JPanel initializtion_Week()
{// 显示星期的panel
JPanel panel = new JPanel();

panel.setLayout(new GridLayout(1, 7));

String columnNames[] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
JLabel label = null;
for (int i = 0; i < 7; i++)
{
label = new JLabel(columnNames[i], JLabel.CENTER);
if (i == 0 || i == 6) label.setForeground(Color.RED);
label.setBorder(new LineBorder(Color.BLUE));
panel.add(label);
}
return panel;
}

private JPanel initializtion_Calendar()
{// 显示日期的panel
JPanel panel = new JPanel();

panel.setLayout(new GridLayout(6, 7));
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 7; j++)
{
label = new JLabel("", JLabel.CENTER);

datas[i][j] = label;
label.setBorder(new LineBorder(Color.BLUE));
if (j == 0 || j == 6) label.setForeground(Color.RED);
datas[i][j].addMouseListener(new List_MouseListener());
panel.add(label);
}
}
return panel;
}

public void clear_Data()
{// 清空内容的
for (int i = 0; i < 6; i++)
for (int j = 0; j < 7; j++)
{
datas[i][j].setText("");
if (j == 0 || j == 6) datas[i][j].setForeground(Color.RED);
else datas[i][j].setForeground(null);
}
}

public void initializtion_Data(Calendar calendar)
{// 初始化函数
// //////////////////////////////////////////////////
// //////////////////////////////////////////////////////////
/*
* 节日和纪念日 格式:起始年(yyyy)+月(mm)+日(dd)
* 0000表示起始年不明
*/
HashMap<String, String> sFestival = new HashMap<String, String>();
// String []sFestival_={
sFestival.put("0101", " 元旦");
sFestival.put("0214", "情人节");
sFestival.put("0308", "妇女节");
sFestival.put("0312", "植树节");
sFestival.put("0401", "愚人节");
sFestival.put("0501", "劳动节");
sFestival.put("0504", "青年节");
sFestival.put("0601", "儿童节");
sFestival.put("0701", "建党节");
sFestival.put("0801", "建军节");
sFestival.put("0910", "教师节");
sFestival.put("1001", "国庆节");
sFestival.put("1031", "万圣节");
sFestival.put("1112", "孙中山诞辰");
sFestival.put("1225", "圣诞节");
sFestival.put("1226", "毛泽东诞辰");
// };
// 某月第几个星期几
// 起始年(4位)+月(2位)+第几个(1位)+星期几(1位)
HashMap<String, String> wFestival = new HashMap<String, String>();
// String []wFestival={
wFestival.put("0520", "母亲节");
wFestival.put("0630", "父亲节");
wFestival.put("1144", "感恩节");
// };
// 农历 99表示月最后一天
HashMap<String, String> lFestival = new HashMap<String, String>();
// String []lFestival={
lFestival.put("0101", "春 节");
lFestival.put("0102", "大年初二");
lFestival.put("0103", "大年初三");
lFestival.put("0115", "元宵节");
lFestival.put("0505", "端午节");
lFestival.put("0707", "七 夕");
lFestival.put("0815", "中秋节");
lFestival.put("0909", "重阳节");
lFestival.put("1208", "腊八节");
lFestival.put("1299", "除 夕");
// };

this.calendar = calendar;
today = calendar.get(Calendar.DAY_OF_MONTH);
int month = calendar.get(Calendar.MONTH);
int weekindexDay;
int weekindexMonth;

calendar.set(Calendar.DATE, 1);

while (calendar.get(Calendar.MONTH) == month)
{
weekindexMonth = calendar.get(Calendar.WEEK_OF_MONTH) - 1;
weekindexDay = calendar.get(Calendar.DAY_OF_WEEK) - 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
// /////////////////////////////////////////////
String today_, month_;
today_ = day < 10?"0" + day:"" + day;
month_ = month < 10?"0" + (month + 1):"" + (month + 1);
Lunar lunar = new Lunar(calendar);
String lunar_ = lunar.toString();
// /////////////////////////////////////////
if (null != sFestival.get(month_ + today_)) lunar_ = "<font color=red>" + sFestival.get

(month_ + today_);
// /////
String wFestival_ = month_ + (weekindexMonth) + (weekindexDay);

if (null != wFestival.get(wFestival_))
{
lunar_ = "<font color=red>" + wFestival.get(wFestival_);
System.out.println(wFestival_);
}

if (null != lFestival.get(lunar.numeric_md())) lunar_ = "<font color=red>" + lFestival.get

(lunar.numeric_md());

// 计算除夕
Calendar temp_calendar = Calendar.getInstance();
temp_calendar.set(calendar.get(Calendar.YEAR), month, day + 1);

// temp_calendar.add(Calendar.DAY_OF_MONTH,1);
Lunar temp_lunar = new Lunar(temp_calendar);
String temp_str = temp_lunar.numeric_md();
if (temp_str.equals("0101")) lunar_ = "<font color=red>" + lFestival.get("1299");
// /计算除夕结束
// ////////////////////////////////////////
String day_str;
if (day < 10) day_str = "<html><center><font size=6>" + today_;
else day_str = "<html><center><font size=6>" + today_;

day_str += "</font><br>" + lunar_;

if (day == today) datas[weekindexMonth][weekindexDay].setForeground(Color.GREEN);
datas[weekindexMonth][weekindexDay].setText(day_str);
calendar.add(Calendar.DATE, 1);
}
}

public void actionPerformed(ActionEvent e)
{// 日期和年份的选择更新
int year = Integer.parseInt(year_box.getSelectedItem().toString());
int month = Integer.parseInt(month_box.getSelectedItem().toString()) - 1;
calendar.set(year, month, today);
clear_Data();
initializtion_Data(calendar);
}

class LookAndFeel_Listener implements ActionListener
{// 选择外观的样式
public void actionPerformed(ActionEvent ev)
{
JRadioButton o = (JRadioButton)ev.getSource();
String str = o.getText();
if ("c" == str)
{
try
{
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
}
catch (Exception e)
{
e.printStackTrace();
}
}
else if ("s" == str)
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e)
{
e.printStackTrace();
}
}
else if ("m" == str)
{
try
{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
}
catch (Exception e)
{
e.printStackTrace();
}
}
SwingUtilities.updateComponentTreeUI(TestCenter.this);
}

}

class Statement_Listener implements ActionListener
{// 显示声明信息
JDialog dialog = null;

public void actionPerformed(ActionEvent ev)
{
String statment = "<html>阴历及节日程序 2008 beta1";
statment += "<br>免费软件(Free Software) 你可以无限传播与反编译.";
statment += "<br>该日历有三种外观样式,有从1900年至2049年间的所有阴历.";
statment += "<br>个人爱好开发 作者:朱春 Email:npuxbd@163.com";
statment += "<br>Copyright @ 2008- All Rights Reserved";
dialog = new JDialog(TestCenter.this, "阴历及节日软件 2008 beta1", true);
dialog.setLayout(null);
dialog.setBounds(285, 215, 365, 185);
JLabel label_s = new JLabel(statment);// label_s.setBackground(Color.RED);
JButton button = new JButton("确 定");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evet)
{
dialog.setVisible(false);
}
});
dialog.add(label_s);
label_s.setBounds(20, 0, 365, 100);
dialog.add(button);
button.setBounds(145, 110, 65, 25);
dialog.setVisible(true);
}

}

class List_MouseListener implements MouseListener
{// 鼠标移入时显示的信息
JLabel labe = null;
String weeks[] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};

public String constellation(Calendar cal)
{

String[][] con = {{"水瓶座", "0122", "0221"}, {"双鱼座", "0222", "0321"}, {"白羊座", "0322",

"0420"}, {"金牛座", "0421", "0521"}, {"双子座", "0522", "0621"}, {"巨蟹座", "0621", "0721"}, {"狮子座", "0722",

"0821"}, {"处女座", "0822", "0921"}, {"天秤座", "0922", "1021"}, {"天蝎座", "1022", "1121"}, {"射手座", "1122",

"1221"}, {"摩羯座", "1222", "0121"}};
int month = cal.get(Calendar.MONTH) + 1;
int today = cal.get(Calendar.DAY_OF_MONTH);
String month_str = month < 10?"0" + month:"" + month;
String today_str = today < 10?"0" + today:"" + today;
String str = month_str + today_str;
for (int i = 0; i < con.length - 1; i++)
{
if (Integer.parseInt(str) >= Integer.parseInt(con[i][1]) && Integer.parseInt(str) <=

Integer.parseInt(con[i][2])) return con[i][0];

}
if ((Integer.parseInt(str) >= Integer.parseInt(con[11][1]) && Integer.parseInt(str) < 1232)

|| Integer.parseInt(str) <= Integer.parseInt(con[11][2])) return con[11][0];

return "error!";
}

public void mouseClicked(MouseEvent e)
{// 鼠标按键在组件上单击(按下并释放)时调用。

}

public void mouseEntered(MouseEvent e)
{// 鼠标进入到组件上时调用。
labe = (JLabel)e.getSource();
String lab = labe.getText();
if (lab != "")
{
labe.setBackground(Color.red);
String day = lab.substring(lab.indexOf("size=6>") + 7, lab.indexOf("</font>"));
// String lun=lab.substring(lab.indexOf("<br>")+4);
String message = "<html><body><center>公元 " + year_box.getSelectedItem() + "年" +

month_box.getSelectedItem() + "月" + Integer.parseInt(day) + "日";
calendar.set(Integer.parseInt(year_box.getSelectedItem().toString()),

Integer.parseInt(month_box.getSelectedItem().toString()) - 1, Integer.parseInt(day));
Lunar lunar = new Lunar(calendar);
message += "<br><font color=red>" + weeks[(calendar.get(calendar.DAY_OF_WEEK) - 1)];
message += "    " + constellation(calendar) + "</font><br>农历

";
message += lunar.get_month() + "月" + lunar.get_Big_Or_Small() +

"    " + lunar.get_date() + "日";
// message+=lunar.get_JQ();
labe.setToolTipText(message);
labe.setBackground(Color.BLUE);
labe.setOpaque(true);
// System.out.println(day+":"+lun);
}
}

public void mouseExited(MouseEvent e)
{// 鼠标离开组件时调用。

labe.setBackground(null);
labe.setOpaque(true);
}

public void mousePressed(MouseEvent e)
{// 鼠标按键在组件上按下时调用。

}

public void mouseReleased(MouseEvent e)
{// 鼠标按钮在组件上释放时调用。
}

}
// ///////////////////////////////////////////////////////
private JLabel datas[][] = new JLabel[6][7];// 显示一月的日期
private JLabel temp_label = null;
private JLabel label = null;
private JPanel panel_Header, panel_Week, panel_Calendar;
private Calendar calendar = null;
private JComboBox year_box = null;
private JComboBox month_box = null;
private int today;
private JRadioButton cross = null, system = null, motif = null;
private ButtonGroup feel_group = null;
private JButton show_help = null;

}

/*
* 以下是阴历对象; 是从网络中得来的;
*/
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年的总天数
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年闰月的天数
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
final private static int leapMonth(int y)
{
return (int)(lunarInfo[y - 1900] & 0xf);
}

// ====== 传回农历 y年m月的总天数
final private static int monthDays(int y, int m)
{
if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0) return 29;
else return 30;
}

// ====== 传回农历 y年的生肖
final public String animalsYear()
{
final String[] Animals = new String[]{"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "

狗", "猪"};
return Animals[(year - 4) % 12];
}

// ====== 传入 月日的offset 传回干支, 0=甲子
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=甲子
final public String cyclical()
{
int num = year - 1900 + 36;
return (cyclicalm(num));
}

/** */
/**
* 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数 ? monCyl4:从1900年1月31日以来,闰月数
* dayCyl5:与1900年1月31日相差的天数,再加40 ?
*
* @param cal
* @return
*/
public Lunar(Calendar cal)
{
// cal.add(cal.get(Calendar.DAY_OF_MONTH),1);
@SuppressWarnings(" unused ")
int yearCyl, monCyl, dayCyl;
int leapMonth = 0;
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)((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);
dayCyl = offset + 40;
monCyl = 14;

// 用offset减去每农历年的天数
// 计算当天是农历第几天
// i最终结果是农历的年份
// offset是当年的第几天
int iYear, daysOfYear = 0;
for (iYear = 1900; iYear < 2050 && offset > 0; iYear++)
{
daysOfYear = yearDays(iYear);
offset -= daysOfYear;
monCyl += 12;
}
if (offset < 0)
{
offset += daysOfYear;
iYear--;
monCyl -= 12;
}
// 农历年份
year = iYear;

yearCyl = iYear - 1864;
leapMonth = leapMonth(iYear); // 闰哪个月,1-12
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;
if (!leap) monCyl++;
}
// offset为0时,并且刚才计算的月份是闰月,要校正
if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1)
{
if (leap)
{
leap = false;
}
else
{
leap = true;
--iMonth;
--monCyl;
}
}
// offset小于0时,也要校正
if (offset < 0)
{
offset += daysOfMonth;
--iMonth;
--monCyl;
}
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 "";
if (day == 10) return "初十";
else return chineseTen[day / 10] + chineseNumber
;
}

public String toString()
{
return /* cyclical() + "年" + */(leap?"闰":"") + chineseNumber[month - 1] + "月" +

getChinaDayString(day);
}

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;
}

public String get_month()
{// 返回阴历的月份
return chineseNumber[month - 1];
}

public String get_date()
{// 返回阴历的天
return getChinaDayString(day);
}

public String get_Big_Or_Small()
{// 返回的月份的大或小
return Big_Or_Small[month - 1];
}

}
class SwingConsole
{// 提供安全线程机制
public static void run(final JFrame f, final int width, final int height)
{
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(width, height);
f.setVisible(true);
}
});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: