JAVA线程万年历(阳历+阴历+节日+时间)

JAVA线程万年历(阳历+阴历+节日+时间)

package myCalendar;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util.Calendar;
 class Clock extends Canvas implements Runnable{
     /**
     *
     */
    private static final long serialVersionUID = 3660124045489727166L;
    MainFrame mf;
    Thread t;
    String time;
     public Clock(MainFrame mf){
    this.mf=mf;
    setSize(280,40);
    setBackground(Color.white);
    t=new Thread(this);                //实例化线程
    t.start();                        //调用线程
    }
     public void run(){
     while(true){
     try{
    Thread.sleep(1000);                    //休眠1秒钟
     }catch(InterruptedException e){
    System.out.println("异常");
    }
    this.repaint(100);
    }
    }
     public void paint(Graphics g){
    Font f=new Font("宋体",Font.BOLD,16);
    SimpleDateFormat SDF=new SimpleDateFormat("yyyy'年'MM'月'dd'日'HH:mm:ss");//格式化时间显示类型
    Calendar now=Calendar.getInstance();
    time=SDF.format(now.getTime());        //得到当前日期和时间
    g.setFont(f);
    g.setColor(Color.black);
    g.drawString(time,45,25);
    }
}
package myCalendar;

import java.awt.Color;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
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;

        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);
        //return year + "年" + (leap ? "闰" : "") + chineseNumber[month - 1] + "月" + getChinaDayString(day);
    }
}
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 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("下个月");

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

         for (int i = 0; i < 49; i++) {
            label[i] = new JLabel("", JLabel.CENTER);// 将显示的字符设置为居中
            panel2.add(label[i]);
        }
        panel3.add(new Clock(this));
        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;
    }

   // @SuppressWarnings("deprecation")
     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++) {
        	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] );
        }
    }

     public static void main(String[] args) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        new MainFrame();
    }
}

作者:冲天之峰     20160623

时间: 2024-10-19 18:38:53

JAVA线程万年历(阳历+阴历+节日+时间)的相关文章

atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源

atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源 1. GMT(Greenwich Mean Time)是格林尼治平时 2 2. UTC是协调世界时(Universal Time Coordinated)英文缩写,gmt tsabdd 2 3. 而CST却同时可以代表如下 4 个不同的时区: 2 4. DST所谓「夏日节约时间」Daylight Saving Time(简称D.S.T.) 2 5. CET欧洲中部时间

在Java 8中如何处理日期和时间

常有人问我学习一个新库的最好方式是什么?我的答案是在实际项目中使用它.项目中有很多真正的需求驱使开发者去发掘并学习新库.简单得说就是任务驱动学习探 索.这对Java 8新日期时间API也不例外.我创建了20个基于任务的实例来学习Java 8的新特性.从最简单创建当天的日期开始,然后创建时间及时区,接着模拟一个日期提醒应用中的任务--计算重要日期的到期天数,例如生日.纪念日.账单 日.保费到期日.信用卡过期日等.示例 1.在Java 8中获取今天的日期Java 8 中的 LocalDate 用于表

20 个案例教你在 Java 8 中如何处理日期和时间?

前言 前面一篇文章写了<SimpleDateFormat 如何安全的使用?>, 里面介绍了 SimpleDateFormat 如何处理日期/时间,以及如何保证线程安全,及其介绍了在 Java 8 中的处理时间/日期默认就线程安全的 DateTimeFormatter 类.那么 Java 8 中该怎么样处理生活中常见的一些日期/时间呢?比如:计算一周后的日期:计算一年前或一年后的日期:检查闰年等. 接下来创建了 20 个基于任务的实例来学习 Java 8 的新特性.从最简单创建当天的日期开始,然

java 线程详解

5月7号  周末看了一下线程方面的内容 ,边看视频边看书还附带着参考了很多人的博客,一天的收获,写下来整理一下:感觉收获还是挺多的:过段时间可能看完java  这几大块要去看一下关于spring boot  的内容顺便  也整理一下:附上我参考的 几本书: 关于java  线程,首先要了解一下线程和进程之间的关系.区别以及他们之间的概念: 首先是线程: 什么是线程? 线程是在程序执行过程中能够执行部分代码的一个执行单元,也看看做是一个轻量级的进程:线程是程序内的程序控制流只能使用程序内分配给程序

Java 线程第三版 第四章 Thread Notification 读书笔记

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException

Java线程使用大全

1.线程实现 1.Thread类 构造方法: 案例代码: public class Ex10_1_CaseThread extends Thread {// 创建一个类继承(extend)Thread类 String studentName; public Ex10_1_CaseThread(String studentName) {// 定义类的构造函数,传递参数 System.out.println(studentName + "申请访问服务器"); this.studentNam

java线程详细介绍

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1

Java线程经典面试题

53道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并

Java线程面试题 Top 50

原文链接: javarevisited 翻译: ImportNew.com- 李 广译文链接: http://www.importnew.com/12773.html 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关的问题在面试中经常会被提到. 在典型的Java面试中, 面试官会从线程