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;elsereturn 29;} elsereturn 0;}//====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0final 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;elsereturn 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 "初十";elsereturn 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-12leap = 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);} elsedaysOfMonth = 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(); // 实例化CalendarMainFrame() {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-11c_year = Integer.parseInt(com1.getSelectedItem().toString())-1; // 得到当前所选年份if(e.getSource()==but1){ if(c_month==0){c_year=c_year-1;c_month=11;}elsec_month=c_month-1;}if(e.getSource()==but2){if(c_month==11){c_year=c_year+1;c_month=0;}elsec_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-11c_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-11c_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-11c_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);}elselabel[i].setText(count +LunarDate[i-week_log] );}}public static void main(String[] args) {JFrame.setDefaultLookAndFeelDecorated(true);new MainFrame();}
}

作者:冲天之峰     20160623

JAVA线程万年历(阳历+阴历+节日+时间)相关推荐

  1. Python基于tk界面的万年历+阳历阴历(附完整代码)

    一.介绍tkinter并下载 tkinter tkinter(Tk interface)是Python的标准GUl库,支持跨平台的GUl程序开发.tkinter适合小型的GUl程序编写,也特别适合初学 ...

  2. java 线程什么时候出栈_在Java中给出的时间

    java 线程什么时候出栈 tl; dr,您可以使用标签来阐明给定的测试时间样式. 什么时候给出? 给定的时间,然后是指定系统行为的一种常用样式,其中您的测试分为三个部分. 给定的部分列出了测试的先决 ...

  3. Java线程池七个参数详解:核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂、拒绝策略

    源码简介 ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它提供了任务提交.线程管理.监控等方法. 下面是ThreadPoolExecutor类的构造 ...

  4. java线程切换消耗时间_cpu性能消耗分析

    在Linux中,CPU主要用于中断.内核以及用户进程的任务处理,优先级为中断>内核>用户进程,在学习如何分析CPU消耗状况前.先要掌握三个重要的概念 1.上下文切换 每个CPU在同一时间只 ...

  5. 嵌入式软件开发培训笔记——java第五天(API——math/string/集合/日期时间以及java线程)

    目录 掌握命令行参数的使用 掌握Math类中常用的方法 掌握String/StringBuffer/StringBuilder的用法 掌握几种常用集合类的用法 掌握日期和时间处理 1.命令行参数 Ja ...

  6. java线程池存在时间_Java线程池基础

    目录: 一.线程池概述 1.线程池类 目前线程池类一般有两个,一个来自于Spring,一个来自于JDK: 来自Spring的线程池:org.springframework.scheduling.con ...

  7. java万年历课程设计代码,JAVA《万年历系统》课程设计

    JAVA<万年历系统>课程设计 面向对象程序设计面向对象程序设计 课程设计报告课程设计报告 题目题目 万年历系统万年历系统 专业专业 计算机科学与技术计算机科学与技术 班级班级 姓名姓名 ...

  8. java8 日期比较_20 个案例教你在 Java 8 中如何处理日期和时间?

    点击左上角蓝字,关注"SpringForAll社区" 专注分享Spring周边技术内容 前言 前面一篇文章写了<SimpleDateFormat 如何安全的使用?>, ...

  9. java打印输出万年历_Java基础之打印万年历的简单实现(案例)

    Java基础之打印万年历的简单实现(案例) 问题:输入年,月,打印对应年月的日历. 示例: 问题分析: 1,首先1970年是Unix系统诞生的时间,1970年成为Unix的元年,1970年1月1号是星 ...

最新文章

  1. 点击改变div高度_css实现div两列布局(两种方法)
  2. How to run CAB file
  3. Halcon中数据的四舍五入、取整、有效数字以及和字符串之间的转换
  4. Doxygen基本用法
  5. 40亿移动设备的用户画像和标签架构实践
  6. 怎么看有没有安装libevent_家里有没有必要安装前置净水器?先听听师傅是怎么说的...
  7. CF1458C Latin Square
  8. java 多重属性_最全面的44个Java 性能调优细节
  9. 技术动态 | 知识图谱上的实体链接
  10. 让我们用 SQL 开发一个图形数据库吧
  11. PHP依赖管理工具Composer配置安装及基本使用
  12. IOS中常见UI细节和常识
  13. 功率曲线k值_锂电池放电曲线全面解析
  14. C语言中char和char *a[]和char (*a)[]
  15. 如何用WPS表格制作甘特图?WPS表格制作甘特图详解!
  16. Python肺CT图像窗位窗宽调整
  17. 蒟蒻朱的 CSP2020 J/S 游记
  18. 云有约 | 首攻RSA,天空卫士“秀肌肉”怎么样了?
  19. CTFHUB中的文件上传——文件头检查
  20. 回看共识层进化规律,“POS+”也许是公链后期发展的出路

热门文章

  1. MATLAB算法实战应用案例精讲-【自动驾驶】精准定位RTK
  2. java解析odt_java - 使用Java从odt文件读取XForm - 堆栈内存溢出
  3. 频分.码分.时分.波分.空分的基本原理
  4. python线条粗细_更改matplotlib pyplot图例中的线条宽度
  5. 应用调试之使用strace命令跟踪系统调用
  6. Microsoft365有用吗?2023最新版office有哪些新功能?
  7. 中毒后的反思,我再也受不了
  8. 行业深度解读:当区块链遇见汽车后市场
  9. Adobe RIA 开发工程师认证考试大纲
  10. pg数据库每周备份并自动删除脚本