设计内容:
1.运用程序设计基础基本知识,使用C、Java或Python等面向对象程序设计语言,按以下要求编程实现万年历的功能:
(1)输入任一年,判断该年是否为闰年;
(2)输入年月日计算该日为星期几,为该年的第几天;
(3)输入任一年,显示该年的日历,日历包括星期、阳历、农历、节气;
2. 要求
(1)界面简洁大方;
(2)操作简单方便;
(3)程序模块划分合理,注释完整,可读性强。
代码 Lunar.java
package myCalendar;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Lunar {
private int year;
private int month;
private int day;
private boolean leap;
final static String chineseNumber[] = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"};
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));
}
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[n];
}
/** */
/**
* 传出y年m月d日对应的农历.
* yearCyl3:农历年与1864的相差数 ?
* monCyl4:从1900年1月31日以来,闰月数
* dayCyl5:与1900年1月31日相差的天数,再加40 ?
*
* @param cal
* @return
*/
public String getLunarDate(int year_log, int month_log, int day_log) {
//@SuppressWarnings("unused")
int yearCyl, monCyl, dayCyl;
int leapMonth = 0;
String nowadays;
Date baseDate = null;
Date nowaday = null;
try {
baseDate = chineseDateFormat.parse("1900年1月31日");
} catch (ParseException e) {
e.printStackTrace(); //To change body of catch statement use Options | File Templates.
}
nowadays = year_log + "年" + month_log + "月" + day_log + "日";
try {
nowaday = chineseDateFormat.parse(nowadays);
} catch (ParseException e) {
e.printStackTrace(); //To change body of catch statement use Options | File Templates.
}
//求出和1900年1月31日相差的天数
int offset = (int) ((nowaday.getTime() - baseDate.getTime()) / 86400000L);
dayCyl = offset + 40;
monCyl = 14;
//用offset减去每农历年的天数
// 计算当天是农历第几天
//i最终结果是农历的年份
//offset是当年的第几天
int iYear, daysOfYear = 0;
for (iYear = 1900; iYear < 10000 && 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;
//System.out.println(year+"\t"+month+"\t"+day);
if (((month) == 1) && day == 1) {
return "春节";
} else if (((month) == 1) && day == 15) {
return "元宵";
} else if (((month) == 5) && day == 5)
return "端午";
else if (((month) == 8) && day == 15)
return "中秋";
else if (day == 1)
return chineseNumber[month - 1] + "月";
else
return getChinaDayString(day);
}
public String toString() {
if (chineseNumber[month - 1] == "一" && getChinaDayString(day) == "初一")
return "农历" + year + "年";
else if (getChinaDayString(day) == "初一")
return chineseNumber[month - 1] + "月";
else
return getChinaDayString(day);
}
}
代码 SolarTerm.java
package myCalendar;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SolarTerm {
private static final double D = 0.2422;
private final static Map<String, Integer[]> INCREASE_OFFSETMAP = new HashMap<String, Integer[]>();// +1偏移
private final static Map<String, Integer[]> DECREASE_OFFSETMAP = new HashMap<String, Integer[]>();// -1偏移
/**
* 24节气
**/
private static enum SolarTermsEnum {
LICHUN, // --立春
YUSHUI, // --雨水
JINGZHE, // --惊蛰
CHUNFEN, // 春分
QINGMING, // 清明
GUYU, // 谷雨
LIXIA, // 立夏
XIAOMAN, // 小满
MANGZHONG, // 芒种
XIAZHI, // 夏至
XIAOSHU, // 小暑
DASHU, // 大暑
LIQIU, // 立秋
CHUSHU, // 处暑
BAILU, // 白露
QIUFEN, // 秋分
HANLU, // 寒露
SHUANGJIANG, // 霜降
LIDONG, // 立冬
XIAOXUE, // 小雪
DAXUE, // 大雪
DONGZHI, // 冬至
XIAOHAN, // 小寒
DAHAN;// 大寒
}
static {
DECREASE_OFFSETMAP.put(SolarTermsEnum.YUSHUI.name(),
new Integer[]{2026});// 雨水
INCREASE_OFFSETMAP.put(SolarTermsEnum.CHUNFEN.name(),
new Integer[]{2084});// 春分
INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOMAN.name(),
new Integer[]{2008});// 小满
INCREASE_OFFSETMAP.put(SolarTermsEnum.MANGZHONG.name(),
new Integer[]{1902});// 芒种
INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAZHI.name(),
new Integer[]{1928});// 夏至
INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOSHU.name(), new Integer[]{
1925, 2016});// 小暑
INCREASE_OFFSETMAP.put(SolarTermsEnum.DASHU.name(),
new Integer[]{1922});// 大暑
INCREASE_OFFSETMAP.put(SolarTermsEnum.LIQIU.name(),
new Integer[]{2002});// 立秋
INCREASE_OFFSETMAP.put(SolarTermsEnum.BAILU.name(),
new Integer[]{1927});// 白露
INCREASE_OFFSETMAP.put(SolarTermsEnum.QIUFEN.name(),
new Integer[]{1942});// 秋分
INCREASE_OFFSETMAP.put(SolarTermsEnum.SHUANGJIANG.name(),
new Integer[]{2089});// 霜降
INCREASE_OFFSETMAP.put(SolarTermsEnum.LIDONG.name(),
new Integer[]{2089});// 立冬
INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOXUE.name(),
new Integer[]{1978});// 小雪
INCREASE_OFFSETMAP.put(SolarTermsEnum.DAXUE.name(),
new Integer[]{1954});// 大雪
DECREASE_OFFSETMAP.put(SolarTermsEnum.DONGZHI.name(), new Integer[]{
1918, 2021});// 冬至
INCREASE_OFFSETMAP.put(SolarTermsEnum.XIAOHAN.name(),
new Integer[]{1982});// 小寒
DECREASE_OFFSETMAP.put(SolarTermsEnum.XIAOHAN.name(),
new Integer[]{2019});// 小寒
INCREASE_OFFSETMAP.put(SolarTermsEnum.DAHAN.name(),
new Integer[]{2082});// 大寒
}
// 定义一个二维数组,第一维数组存储的是20世纪的节气C值,第二维数组存储的是21世纪的节气C值,0到23个,依次代表立春、雨水...大寒节气的C值
private static final double[][] CENTURY_ARRAY = {
{4.6295, 19.4599, 6.3826, 21.4155, 5.59, 20.888, 6.318, 21.86,
6.5, 22.2, 7.928, 23.65, 8.35, 23.95, 8.44, 23.822, 9.098,
24.218, 8.218, 23.08, 7.9, 22.6, 6.11, 20.84},
{3.87, 18.73, 5.63, 20.646, 4.81, 20.1, 5.52, 21.04, 5.678, 21.37,
7.108, 22.83, 7.5, 23.13, 7.646, 23.042, 8.318, 23.438,
7.438, 22.36, 7.18, 21.94, 5.4055, 20.12}};
/**
* @param year 年份
* @param name 节气的名称
* @return 返回节气是相应月份的第几天
*/
public static int getSolarTermNum(int year, String name) {
double centuryValue = 0;// 节气的世纪值,每个节气的每个世纪值都不同
name = name.trim().toUpperCase();
int ordinal = SolarTermsEnum.valueOf(name).ordinal();
int centuryIndex = -1;
if (year >= 1901 && year <= 2000) {// 20世纪
centuryIndex = 0;
} else if (year >= 2001 && year <= 2100) {// 21世纪
centuryIndex = 1;
} else {
throw new RuntimeException("不支持此年份:" + year
+ ",目前只支持1901年到2100年的时间范围");
}
centuryValue = CENTURY_ARRAY[centuryIndex][ordinal];
int dateNum = 0;
/**
* 计算 num =[Y*D+C]-L这是传说中的寿星通用公式
* 公式解读:年数的后2位乘0.2422加C(即:centuryValue)取整数后,减闰年数
*/
int y = year % 100;// 步骤1:取年分的后两位数
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {// 闰年
if (ordinal == SolarTermsEnum.XIAOHAN.ordinal()
|| ordinal == SolarTermsEnum.DAHAN.ordinal()
|| ordinal == SolarTermsEnum.LICHUN.ordinal()
|| ordinal == SolarTermsEnum.YUSHUI.ordinal()) {
// 注意:凡闰年3月1日前闰年数要减一,即:L=[(Y-1)/4],因为小寒、大寒、立春、雨水这两个节气都小于3月1日,所以
// y = y-1
y = y - 1;// 步骤2
}
}
dateNum = (int) (y * D + centuryValue) - (int) (y / 4);// 步骤3,使用公式[Y*D+C]-L计算
dateNum += specialYearOffset(year, name);// 步骤4,加上特殊的年分的节气偏移量
return dateNum;
}
/**
* 特例,特殊的年分的节气偏移量,由于公式并不完善,所以算出的个别节气的第几天数并不准确,在此返回其偏移量
*
* @param year 年份
* @param name 节气名称
* @return 返回其偏移量
*/
private static int specialYearOffset(int year, String name) {
int offset = 0;
offset += getOffset(DECREASE_OFFSETMAP, year, name, -1);
offset += getOffset(INCREASE_OFFSETMAP, year, name, 1);
return offset;
}
private static int getOffset(Map<String, Integer[]> map, int year,
String name, int offset) {
int off = 0;
Integer[] years = map.get(name);
if (null != years) {
for (int i : years) {
if (i == year) {
off = offset;
break;
}
}
}
return off;
}
private static int mYear;
private static List<String> mSolarData = new ArrayList<String>();
private static List<String> mSolarName = new ArrayList<String>();
/**
* 判断一天是什么节气
*
* @param year
* @param data 月份占两位,日不确定,如一月一日为:011,五月十日为0510
* @return
* @data2015-12-2下午2:49:32
*/
public static String getSolatName(int year, String data) {
for (int i = 0; i < mSolarData.size(); i++) {
//System.out.println(mSolarData.get(i));
}
if (year != mYear) {
solarTermToString(year);
}
if (mSolarData.contains(data)) {
return mSolarName.get(mSolarData.indexOf(data));
} else {
return null;
}
}
private static void solarTermToString(int year) {
mYear = year;
if (mSolarData != null) {
mSolarData.clear();
} else {
mSolarData = new ArrayList<String>();
}
if (mSolarName != null) {
mSolarName.clear();
} else {
mSolarName = new ArrayList<String>();
}
// 1
mSolarName.add("立春");
mSolarData.add("2"
+ getSolarTermNum(year, SolarTermsEnum.LICHUN.name()));
// 2
mSolarName.add("雨水");
mSolarData.add("2"
+ getSolarTermNum(year, SolarTermsEnum.YUSHUI.name()));
// 3
mSolarName.add("惊蛰");
mSolarData.add("3"
+ getSolarTermNum(year, SolarTermsEnum.JINGZHE.name()));
// 4
mSolarName.add("春分");
mSolarData.add("3"
+ getSolarTermNum(year, SolarTermsEnum.CHUNFEN.name()));
// 5
mSolarName.add("清明");
mSolarData.add("4"
+ getSolarTermNum(year, SolarTermsEnum.QINGMING.name()));
// 6
mSolarName.add("谷雨");
mSolarData.add("4" + getSolarTermNum(year, SolarTermsEnum.GUYU.name()));
// 7
mSolarName.add("立夏");
mSolarData
.add("5" + getSolarTermNum(year, SolarTermsEnum.LIXIA.name()));
// System.out.println(year);
//System.out.println(getSolarTermNum(year, SolarTermsEnum.LIXIA.name()));
// 8
mSolarName.add("小满");
mSolarData.add("5"
+ getSolarTermNum(year, SolarTermsEnum.XIAOMAN.name()));
// 9
mSolarName.add("芒种");
mSolarData.add("6"
+ getSolarTermNum(year, SolarTermsEnum.MANGZHONG.name()));
// 10
mSolarName.add("夏至");
mSolarData.add("6"
+ getSolarTermNum(year, SolarTermsEnum.XIAZHI.name()));
// 11
mSolarName.add("小暑");
mSolarData.add("7"
+ getSolarTermNum(year, SolarTermsEnum.XIAOSHU.name()));
// 12
mSolarName.add("大暑");
mSolarData
.add("7" + getSolarTermNum(year, SolarTermsEnum.DASHU.name()));
// 13
mSolarName.add("立秋");
mSolarData
.add("8" + getSolarTermNum(year, SolarTermsEnum.LIQIU.name()));
// 14
mSolarName.add("处暑");
mSolarData.add("8"
+ getSolarTermNum(year, SolarTermsEnum.CHUSHU.name()));
// 15
mSolarName.add("白露");
mSolarData
.add("9" + getSolarTermNum(year, SolarTermsEnum.BAILU.name()));
// 16
mSolarName.add("秋分");
mSolarData.add("9"
+ getSolarTermNum(year, SolarTermsEnum.QIUFEN.name()));
// 17
mSolarName.add("寒露");
mSolarData.add("10"
+ getSolarTermNum(year, SolarTermsEnum.HANLU.name()));
// 18
mSolarName.add("霜降");
mSolarData.add("10"
+ getSolarTermNum(year, SolarTermsEnum.SHUANGJIANG.name()));
// 19
mSolarName.add("立冬");
mSolarData.add("11"
+ getSolarTermNum(year, SolarTermsEnum.LIDONG.name()));
// 20
mSolarName.add("小雪");
mSolarData.add("11"
+ getSolarTermNum(year, SolarTermsEnum.XIAOXUE.name()));
// 21
mSolarName.add("大雪");
mSolarData.add("12"
+ getSolarTermNum(year, SolarTermsEnum.DAXUE.name()));
// 22
mSolarName.add("冬至");
mSolarData.add("12"
+ getSolarTermNum(year, SolarTermsEnum.DONGZHI.name()));
// 23
mSolarName.add("小寒");
mSolarData.add("01"
+ getSolarTermNum(year, SolarTermsEnum.XIAOHAN.name()));
// 24
mSolarName.add("大寒");
mSolarData
.add("01" + getSolarTermNum(year, SolarTermsEnum.DAHAN.name()));
}
}
代码 MainFrame.java
package myCalendar;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Calendar;
import java.util.Scanner;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
class MainFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
JPanel panel = new JPanel(new BorderLayout());
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel(new GridLayout(7, 7));
JPanel panel3 = new JPanel();
JLabel[] label = new JLabel[49];
JLabel y_label = new JLabel("年份");
JLabel m_label = new JLabel("月份");
JComboBox com1 = new JComboBox();
JComboBox com2 = new JComboBox();
JButton but1 = new JButton("上个月");
JButton but2 = new JButton("下个月");
JButton but4 = new JButton("查询");
int re_year, re_month;
int x_size, y_size;
String year_num;
Calendar now = Calendar.getInstance(); // 实例化Calendar
MainFrame() {
super("万年历");
setSize(600, 700);
x_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());
y_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());
setLocation((x_size - 300) / 2, (y_size - 350) / 2);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel1.add(but1);
panel1.add(y_label);
panel1.add(com1);
panel1.add(m_label);
panel1.add(com2);
panel1.add(but2);
// panel1.add(but3);
panel1.add(but4);
for (int i = 0; i < 49; i++) {
label[i] = new JLabel("", JLabel.CENTER);// 将显示的字符设置为居中
panel2.add(label[i]);
}
panel.add(panel1, BorderLayout.NORTH);
panel.add(panel2, BorderLayout.CENTER);
panel.add(panel3, BorderLayout.SOUTH);
panel.setBackground(Color.white);
panel1.setBackground(Color.white);
panel2.setBackground(Color.white);
panel3.setBackground(Color.gray);
Init();
but1.addActionListener(new AnAction());
but2.addActionListener(new AnAction());
com1.addActionListener(new ClockAction());
com2.addActionListener(new ClockAction());
setContentPane(panel);
setVisible(true);
setResizable(false);
}
class AnAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
int c_year, c_month, c_week;
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_year = Integer.parseInt(com1.getSelectedItem().toString()) - 1; // 得到当前所选年份
if (e.getSource() == but1) {
if (c_month == 0) {
c_year = c_year - 1;
c_month = 11;
} else
c_month = c_month - 1;
}
if (e.getSource() == but2) {
if (c_month == 11) {
c_year = c_year + 1;
c_month = 0;
} else
c_month = c_month + 1;
}
com1.setSelectedIndex(c_year);
com2.setSelectedIndex(c_month);
c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_week = use(c_year, c_month); // 调用函数use,得到星期几
Resetday(c_week, c_year, c_month); // 调用函数Resetday
}
}
/* class NextAction implements ActionListener
{
public void actionPerformed(ActionEvent arg0)
{
int c_year, c_month,c_week;
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份
if(c_month==11)
{
c_year=c_year+1;
c_month=0;
}
c_week = use(c_year, c_month); // 调用函数use,得到星期几
Resetday(c_week, c_year, c_month); // 调用函数Resetday
}
}
*/
class ClockAction implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
int c_year, c_month, c_week;
c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_week = use(c_year, c_month); // 调用函数use,得到星期几
Resetday(c_week, c_year, c_month); // 调用函数Resetday
}
}
public void Init() {
int year, month_num, first_day_num;
String log[] = {"日", "一", "二", "三", "四", "五", "六"};
for (int i = 0; i < 7; i++) {
label[i].setText(log[i]);
}
for (int i = 0; i < 49; i = i + 7) {
label[i].setForeground(Color.blue); // 将星期日的日期设置为红色
}
for (int i = 6; i < 49; i = i + 7) {
label[i].setForeground(Color.blue);// 将星期六的日期设置为hong色
}
for (int i = 1; i < 10000; i++) {
com1.addItem("" + i);
}
for (int i = 1; i < 13; i++) {
com2.addItem("" + i);
}
month_num = (int) (now.get(Calendar.MONTH)); // 得到当前时间的月份
year = (int) (now.get(Calendar.YEAR)); // 得到当前时间的年份
com1.setSelectedIndex(year - 1); // 设置下拉列表显示为当前年???????????
com2.setSelectedIndex(month_num); // 设置下拉列表显示为当前月
first_day_num = use(year, month_num);
Resetday(first_day_num, year, month_num);
}
public int use(int reyear, int remonth) {
int week_num;
now.set(reyear, remonth, 1); // 设置时间为所要查询的年月的第一天
week_num = (int) (now.get(Calendar.DAY_OF_WEEK));// 得到第一天的星期
return week_num;
}
public void Resetday(int week_log, int year_log, int month_log) {
int month_day_score; // 存储月份的天数
int count;
Lunar lunar;
int month_day;
String[] LunarDate = new String[49];
month_day_score = 0;
count = 1;
for (int i = 1; i < 49; i++) {
for (int j = 0; j < 49; j = j + 7) {
if (i != j && i != j + 6)
label[i].setForeground(Color.black);
}
}
Date date = new Date(year_log, month_log + 1, 1); // now MONTH是从0开始的, 对于一月第几天来说,DAY_OF_MONTH第一天就是1. 对于一年第几个月来说,MONTH一月份是0,二月份是1...
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, -1); // 前个月
month_day_score = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 最后一天
month_day = month_day_score;
for (int i = 7; i < 49; i++) { // 初始化标签
label[i].setText("");
}
week_log = week_log + 6; // 将星期数加6,使显示正确
month_day_score = month_day_score + week_log;
lunar = new Lunar();
for (int i = 0; i < month_day; i++) {
LunarDate[i] = lunar.getLunarDate(year_log, month_log + 1, i + 1);
}
for (int i = week_log; i < month_day_score; i++, count++) {
//System.out.println(count);
if (month_log == 9 && count == 1) {
label[i].setText(count + "国庆");
label[i].setForeground(Color.red);
} else if (month_log == 0 && count == 1) {
label[i].setText(count + "元旦");
label[i].setForeground(Color.red);
} else if (month_log == 11 && count == 24) {
label[i].setText(count + "平安夜");
label[i].setForeground(Color.red);
} else if (month_log == 11 && count == 25) {
label[i].setText(count + "圣诞");
label[i].setForeground(Color.red);
} else if (month_log == 1 && count == 14) {
label[i].setText(count + "情人节");
label[i].setForeground(Color.red);
} else if (month_log == 4 && count == 1) {
label[i].setText(count + "劳动节");
label[i].setForeground(Color.red);
} else if (LunarDate[i - week_log].equals("春节") || LunarDate[i - week_log].equals("元宵") || LunarDate[i - week_log].equals("端午") || LunarDate[i - week_log].equals("中秋")) {
label[i].setText(count + LunarDate[i - week_log]);
label[i].setForeground(Color.red);
} else {
label[i].setText(count + LunarDate[i - week_log]);
}
String solarTerm = SolarTerm.getSolatName(year_log, (month_log + 1) + "" + count);
if (solarTerm != null) {
label[i].setText(label[i].getText() + solarTerm);
}
}
}
/**
* 判断给定的年份是否为闰年
*
* @param year:给定的年份
* @return true:闰年;false:平年
*/
public static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
/**
* 判断哪一天
*/
public static void isDay() {
// 实例化Scanner
Scanner scan = new Scanner(System.in);
// 声明年份,月份,日期
int year, month, day;
// 提示用户输入年份
System.out.println("请输入年份:");
// 接受用户输入的年份
year = scan.nextInt();
// 提示用户输入月份
System.out.println("请输入月份:");
// 接受用户输入的月份
month = scan.nextInt();
// 提示用户输入日期
System.out.println("请输入日期:");
// 接受用户输入的日期
day = scan.nextInt();
// 判断月份(注意break位置)
switch (month - 1) {
case 11:
// 日期加上11月的全天数
day += 30;
case 10:
// 日期加上10月的全天数
day += 31;
case 9:
// 日期加上9月的全天数
day += 30;
case 8:
// 日期加上8月的全天数
day += 31;
case 7:
// 日期加上7月的全天数
day += 31;
case 6:
// 日期加上6月的全天数
day += 30;
case 5:
// 日期加上5月的全天数
day += 31;
case 4:
// 日期加上4月的全天数
day += 30;
case 3:
// 日期加上3月的全天数
day += 31;
case 2:
/*
* 日期加上2月的全天数
* 闰年判断
*/
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {// 是
// 天数加29
day += 29;
} else {// 不是
// 天数加28
day += 28;
}
case 1:
//日期加上1月的全天数
day += 31;
default:
// 错误提示
System.out.println("请输入正确月份");
break;
}
// 判断月份是否有误
if (month >= 1 && month <= 12) {
// 打印判断结果
System.out.println("今天是" + year + "年的第" + day + "天");
}
}
public static void main(String[] args) {
while (true) {
System.out.println("输入数字实现功能");
System.out.println("请输入数字:");
System.out.println("0:判断闰年");
System.out.println("1:判断为第几天");
System.out.println("2:日历显示");
Scanner scan = new Scanner(System.in);
int i = 5;
i = scan.nextInt();
switch (i) {
case 0:
System.out.println("请输入年份:");
// 提示用户输入年份
// 接受用户输入的年份
int year = scan.nextInt();
boolean a = isLeapYear(year);
if (a == true) System.out.println("是的");
else System.out.println("不是");
break;
case 1:
isDay();
break;
case 2:
JFrame.setDefaultLookAndFeelDecorated(true);
new MainFrame();
;
break;
default:
JFrame.setDefaultLookAndFeelDecorated(true);
new MainFrame();
break;
}
}
}
}
运行结果