0
点赞
收藏
分享

微信扫一扫

面向对象程序设计实训——万年历

西曲风 2022-03-12 阅读 120

设计内容:

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

 运行结果

 

 

举报

相关推荐

0 条评论