java实现万年历带农历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
public class wannianli extends JFrame implements ActionListener, MouseListener {
private Calendar cld = Calendar.getInstance();//获取一个Calendar类的实例对象
private String[] astr = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
private DefaultTableModel dtm = new DefaultTableModel(null, astr);
private JTable table = new JTable(dtm);
private JScrollPane sp = new JScrollPane(table);
private JButton bLastYear = new JButton("上一年");
private JButton bNextYear = new JButton("下一年");
private JButton bLastMonth = new JButton("上月");
private JButton bNextMonth = new JButton("下月");
private JPanel p1 = new JPanel(); // 设立八个中间容器,装入布局控制日期的按钮模块
private JPanel p2 = new JPanel(new GridLayout(3,2));//网格布局
private JPanel p3 = new JPanel(new BorderLayout());//边界布局
private JPanel p4 = new JPanel(new GridLayout(2,1));
private JPanel p5 = new JPanel(new BorderLayout());
private JPanel p6 = new JPanel(new GridLayout(2,2));
private JPanel p7 = new JPanel(new GridLayout(2,1));
private JPanel p8 = new JPanel(new BorderLayout());
private JComboBox timeBox = new JComboBox(TimeZone.getAvailableIDs());//对所有支持时区进行迭代,获取所有的id;
private JTextField jtfYear = new JTextField(5);// jtfYeaar年份显示输入框
private JTextField jtfMonth = new JTextField(2);// jtfMouth月份显示输入框
private JTextField timeField=new JTextField();//各城市时间显示框
private static JTextArea jta = new JTextArea(10,5);//农历显示区
private JScrollPane jsp = new JScrollPane(jta);
private JLabel l = new JLabel("花江小精灵:亲!你可以直接输入年月查询.");
private JLabel lt = new JLabel();
private JLabel ld = new JLabel();
private JLabel lu = new JLabel("农历和节气");
private JLabel null1=new JLabel();
private int lastTime;
//private String localTime = null;
private String s = null;
private SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒");
public wannianli() {
super("花江日历过去仅留追忆,未来刚生憧憬,唯有坚守本心,把握今天 ZYT 詹永堂 ");// 框架命名
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭函数 this.getContentPane().setLayout(newBorderLayout(9, 10));
jta.setLineWrap(true);// 长度大于分配长度时候则换行
jta.setFont(new Font("黑体", Font.BOLD, 16));
table.setBackground(Color.white);
table.setGridColor(Color.pink);// 星期之间的网
格线是灰色的
table.setBackground(Color.white);
table.setColumnSelectionAllowed(true);// 将table中的列设置为可选择的 table.setSelectionBackground(Color.pink);// 当选定某一天时背景颜色为黑色
table.setSelectionForeground(Color.GREEN);
table.setBackground(new Color(184,207, 229));// 日期显示表格为浅蓝色 table.setFont(new Font("黑体", Font.BOLD, 24));// 日期数字字体格式 table.setRowHeight(26);// 表格的高度
table.addMouseListener(this); // 鼠标监听器、
lu.setFont(new Font("黑体", Font.BOLD, 22));//农历标签格氏
jtfYear.addActionListener(this);// 可输入年份的文本框
// 为各个按钮添加监听函数
bLastYear.addActionListener(this);
bNextYear.addActionListener(this);
bLastMonth.addActionListener(this);
bNextMonth.addActionListener(this);
timeBox.addItemListener(new TimeSelectedChangedListener());
// 将按钮添加到Jpane上
p1.add(bLastYear);
p1.add(jtfYear);// 年份输入文本框
p1.add(bNextYear);
p1.add(bLastMonth);
p1.add(jtfMonth);
p1.add(bNextMonth);
p3.add(jsp, BorderLayout.SOUTH);
p3.add(lu,BorderLayout.CENTER);
p3.add(ld, BorderLayout.NORTH);
p4.add(lt);
p4.add(l);
p5.add(p4, BorderLayout.SOUTH);
p5.add(sp, BorderLayout.CENTER);
p5.add(p1, BorderLayout.NORTH);
p6.add(timeBox);
p6.add(null1);
p6.add(timeField);
p8.add(p2,BorderLayout.CENTER);
p8.add(p7,BorderLayout.SOUTH);
this.getContentPane().add(p3, BorderLayout.EAST);
this.getContentPane().add(p5, BorderLayout.CENTER);
this.getContentPane().add(p6,BorderLayout.SOUTH);
this.getContentPane().add(p8,BorderLayout.WEST);
String[] strDate = DateFormat.getDateInstance().format(new Date()) .split("-");// 获取日期
cld.set(Integer.parseInt(strDate[0]), Integer.parseInt(strDate[1]) - 1,0);
showCalendar(Integer.parseInt(strDate[0]),
Integer.parseInt(strDate[1]), cld);
jtfMonth.setEditable(false);// 设置月份文本框为不可编辑
jtfYear.setText(strDate[0]);
jtfMonth.setText(strDate[1]);
this.showTextArea(strDate[2]);
ld.setFont(new Font("新宋体", Font.BOLD, 24));
new Timer(lt).start();
new TimeThread().start();
this.setBounds(200, 200, 700, 350);
this.setResizable(false);
this.setVisible(true);
}
public void showCalendar(int localYear, int localMonth, Calendar cld) {
int Days = getDaysOfMonth(localYear, localMonth) +
cld.get(Calendar.DAY_OF_WEEK) -2;
Object [] ai = new Object[7];
lastTime = 0;
for (int i = cld.get(Calendar.DAY_OF_WEEK)-1; i<= Days; i++)
{
ai[i%7] = String.valueOf(i-(cld.get(Calendar.DAY_OF_WEEK)-2));
if (i%7 == 6)
{
dtm.addRow(ai);
ai = new Object[7];
lastTime++;
}
}
dtm.addRow(ai);
}
public int getDaysOfMonth(int Year, int Month) {//计算各月的天数
if(Month==1||Month==3||Month==5||Month==7||Month==8||Month==10||Month==12)
{
return 31;
}
if(Month==4||Month==6||Mon
th==9||Month==11)
{
return 30;
}
if(Year%4==0&&Year%100!=0||Year%400==0)//闰年
{
return 29;
}
else {
return 28;
}
}
public void actionPerformed(ActionEvent e)//从界面上获取年月数据
{
if(e.getSource() == jtfYear || e.getSource() == bLastYear || e.getSource() == bNextYear ||
e.getSource() == bLastMonth || e.getSource() == bNextMonth)
{
int m, y;
try//控制输入的年份正确,异常控制
{
if (jtfYear.getText().length() != 4)
{
throw new NumberFormatException();
}
y = Integer.parseInt(jtfYear.getText());
m = Integer.parseInt(jtfMonth.getText());
}
catch (NumberFormatException ex)
{
JOptionPane.showMessageDialog(this, "请输入4位0-9的数字!", "年份有误", JOptionPane.ERROR_MESSAGE);
return;
}
ld.setText("没有选择日期");
for (int i = 0; i
if(e.getSource() ==
bLastYear){ jtfYear.setText(String.valueOf(--y)); }
if(e.getSource() == bNextYear){jtfYear.setText(String.valueOf(++y)); }
if(e.getSource() == bLastMonth)
{
if(m == 1)
{
jtfYear.setText(String.valueOf(--y));
m = 12;
jtfMonth.setText(String.valueOf(m));
}
else
{
jtfMonth.setText(String.valueOf(--m));
}
}
if(e.getSource() == bNextMonth)
{
if(m == 12)
{
jtfYear.setText(String.valueOf(++y));
m = 1;
jtfMonth.setText(String.valueOf(m));
}
else
{
jtfMonth.setText(String.valueOf(++m));
}
}
cld.set(y, m-1, 0);
showCalendar(y, m, cld);
}
}
public void mouseClicked(MouseEvent e)
{
jta.setText(null);
int r = table.getSelectedRow();
int c = table.getSelectedColumn();
if (table.getValueAt(r,c) == null)
{
ld.setText("没有选择日期");
}
else
{
this.showTextArea(table.getValueAt(r,c)); }
}
private void showTextArea(Object selected)
{
ld.setText(jtfYear.getText()+"年"+jtfMonth.getText()+"月"+selected+"日");
}
public static void main(String[] args)
{
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
new wannianli();
jta.setText(today());
}
private void updateTimeText(String timeZoneId) {
if(timeZoneId != null){
TimeZone timeZone = TimeZone.getTimeZone(timeZoneId); dateFormat.setTimeZone(timeZone);
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(timeZone);
timeField.setText(dateFormat.format(calendar.getTime()));
}else{
timeField.setText(null);
}
}
private class TimeSelectedChangedListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange()==ItemEvent.SELECTED) {
if (e.getItem() instanceof String) {
s = e.getItem().toString();
}
}
}
}
private class TimeThread extends Thread{
public void run(){
while(true){
updateTimeText(s);
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackT
race();
}
}
}
}
class Timer extends Thread //显示系统时间
{
private JLabel lt;
private SimpleDateFormat fy = new SimpleDateFormat(" G yyyy.MM.dd HH:mm:ss ");
public Timer(JLabel lt)
{
this.lt=lt;
}
public void run()
{
while(true){
try{
lt.setText(fy.format(new Date()));
this.sleep(500);
}
catch(InterruptedException ex)
{
ex.printStackTrace();
}
}
}
}
final private 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 };
final private static int[] year20 = new int[] { 1, 4, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1 };
final private static int[] year19 = new int[] { 0, 3, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 };
final private static int[] year2000 = new int[] { 0, 3, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1 };
public final static String[] nStr1 = new String[] { "", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一",
"十二" };
private final static String[] Gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };
private final static String[] Zhi = new String[] { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };
private final static String[] Animals = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };
// 传回农历 y年的总天数
final private static int lYearDays(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年闰月的天数
fin
al 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 static String AnimalsYear(int y) {
return Animals[(y - 4) % 12];
}
//传入月日的offset 传回干支,0=甲子
final private static String cyclicalm(int num) {
return (Gan[num % 10] + Zhi[num % 12]);
}
// 传入 offset 传回干支, 0=甲子
final public static String cyclical(int y) {
int num = y - 1900 + 36;
return (cyclicalm(num));
}
// 传出农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
final private long[] Lunar(int y, int m) {
long[] nongDate = new long[7];
int i = 0, temp = 0, leap = 0;
Date baseDate = new GregorianCalendar(1900 + 1900, 1,
31).getTime();
Date objDate = new GregorianCalendar(y + 1900, m, 1).getTime(); long offset = (objDate.getTime() - baseDate.getTime()) / 86400000L;
if (y < 2000)
offset += year19[m - 1];
if (y > 2000)
offset += year20[m - 1];
if (y == 2000)
offset += year2000[m - 1];
nongDate[5] = offset + 40;
nongDate[4] = 14;
for (i = 1900; i< 2050 && offset > 0; i++) {
temp = lYearDays(i);
offset -= temp;
nongDate[4] += 12;
}
if (offset < 0) {
offset += temp;
i--;
nongDate[4] -= 12;
}
nongDate[0] = i;
nongDate[3] = i - 1864;
leap = leapMonth(i); // 闰哪个月
nongDate[6] = 0;
for (i = 1; i< 13 && offset > 0; i++) {
// 闰月
if (leap > 0 &&i == (leap + 1) &&nongDate[6] == 0) {
--i;
nongDate[6] = 1;
temp = leapDays((int) nongDate[0]);
} else {
temp = monthDays((int) nongDate[0], i);
}
// 解除闰月
if (nongDate[6] == 1 &&i == (leap + 1))
nongDate[6] = 0;
offset -= temp;
if (nongDate[6] == 0)
nongDate[4]++;
}
if (offset == 0 && leap > 0 &&i == leap + 1) {
if (nongDate[6] == 1) {
nongDate[6] = 0;
} else {
nongDate[6] = 1;
--i;
--nongDate[4];
}
}
if (offset < 0) {
offset += temp;
--i;
--nongDate[4];
}
nongDate[1] = i;
nongDate[2] = offset + 1;
return nongDate;
}
// 传出y年m月d日对应的农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
final public static long[] calElement(int y, int m, int d) { long[] nongDate = new long[7];
int i = 0, temp = 0, leap = 0;
Date baseDate = new GregorianCalendar(0 + 1900, 0, 31).getTime(); Date objDate = new GregorianCalendar(y, m - 1, d).getTime();
long offset = (objDate.getTime() - baseDate.getTime()) / 86400000L; nongDate[5] = offset + 40;
nongDate[
4] = 14;
for (i = 1900; i< 2050 && offset > 0; i++) {
temp = lYearDays(i);
offset -= temp;
nongDate[4] += 12;
}
if (offset < 0) {
offset += temp;
i--;
nongDate[4] -= 12;
}
nongDate[0] = i;
nongDate[3] = i - 1864;
leap = leapMonth(i); // 闰哪个月
nongDate[6] = 0;
for (i = 1; i< 13 && offset > 0; i++) {
// 闰月
if (leap > 0 &&i == (leap + 1) &&nongDate[6] == 0) {
--i;
nongDate[6] = 1;
temp = leapDays((int) nongDate[0]);
} else {
temp = monthDays((int) nongDate[0], i);
}
// 解除闰月
if (nongDate[6] == 1 &&i == (leap + 1))
nongDate[6] = 0;
offset -= temp;
if (nongDate[6] == 0)
nongDate[4]++;
}
if (offset == 0 && leap > 0 &&i == leap + 1) {
if (nongDate[6] == 1) {
nongDate[6] = 0;
} else {
nongDate[6] = 1;
--i;
--nongDate[4];
}
}
if (offset < 0) {
offset += temp;
--i;
--nongDate[4];
}
nongDate[1] = i;
nongDate[2] = offset + 1;
return nongDate;
}
public final static String getChinaDate(int day) {
String a = "";
if (day == 10)
return"初十";
if (day == 20)
return"二十";
if (day == 30)
return"三十";
int two = (int) ((day) / 10);
if (two == 0)
a = "初";
if (two == 1)
a = "十";
if (two == 2)
a = "廿";
if (two == 3)
a = "三";
int one = (int) (day % 10);
switch (one) {
case 1:
a += "一";
break;
case 2:
a += "二";
break;
case 3:
a += "三";
break;
case 4:
a += "四";
break;
case 5:
a += "五";
break;
case 6:
a += "六";
break;
case 7:
a += "七";
break;
case 8:
a += "八";
break;
case 9:
a += "九";
break;
}
return a;
}
public static String today() {
Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE); int year = today.get(Calendar.YEAR);
int month = today.get(Calendar.MONTH) + 1;
int date = today.get(Calendar.DATE);
long[] l = calElement(year, month, date);
StringBuffer sToday = new StringBuffer();
try {
sToday.append(sdf.format(today.getTime()));
sToday.append(" \n");
sToday.append(" \n");
sToday.append(" \n");
sToday.append(" 农历");
sToday.append(cyclical(year));
sToday.append('(');
sToday.append(AnimalsYear(year));
sToday.append(")年");
sToday.append(" \n");
sToday.append(" ");
sToday.append(nStr1[(int) l[1]]);
sToday.append("月");
sToday.append(getChinaDate((int) (l[2])));
return sToday.toString();
} finally {
sToday = null;
}
}
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日 EEEEE");
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
}