java实现万年历带农历


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) {

}

}

相关文档
最新文档