JAVA万年历代码/*
题目:输出任意年份任意月份万年历java代码的日历表(公元后)
思路:
1.已知1年1月1日是星期日,1 % 7 = 1 对应万年历java代码的是星期日,2 % 7 = 2 对应的是星期一,以此类推;
2.计算当年以前所有天数 当年当月1号之前所有天数;
a.年份分平年闰年,平年365天,闰年366天;
b.闰年的判断方法year % 400 == 0 || (year % 100 != 0year % 4 == 0)若为真,则为闰年否则为平年;
c.定义平年/闰年数组,包含各月天数;
d.遍历数组求和,计算当年当月前总天数;
e.当年以前所有天数 当年当月前总天数 1即为1年1月1日到当年当月1日的总天数;
3.总天数对7取模,根据结果判断当月1号是星期几,输出空白区域;
【万年历java代码 java万年历实验原理】4.输出当月日历表,逢星期六换行
*/
import java.util.Scanner;
class FindMonthList {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year = sc.nextInt();//年份
if (year1) {//判断非法输入年份
System.out.println("输入错误!");
return;
}
System.out.println("请输入月份:");
int month = sc.nextInt();//月份
if (month1 || month12) {//判断非法输入月份
System.out.println("输入错误!");
return;
}
//输出表头
System.out.println("-------"year" 年 "month" 月 ""-------");
System.out.println();
System.out.println("日一二三四五六");
//计算当前年份以前所有天数beforeYearTotalDay;每4年一个闰年,闰年366天,平年365天
int beforeYearTotalDay = ((year - 1) / 4 * 366)(year-1 - ((year - 1) / 4)) * 365;
int[] arrLeapYear = {0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年各月天数int数组
int[] arrNormalYear = {0,31,28,31,30,31,30,31,31,30,31,30,31};//平年各月天数int数组
int beforeMonthTotalDay = 0;//定义本年当月之前月份的总天数
if (year % 400 == 0 || (year % 100 != 0year % 4 == 0)) {//判断当前年份是否是闰年
for (int i = 0 ; imonth ; i) {//for循环计算当月之前总天数
//计算当前月份之前的所有天数
beforeMonthTotalDay = beforeMonthTotalDayarrLeapYear[i];
}
//判断当月1日是星期几
int totalDay = beforeYearTotalDaybeforeMonthTotalDay1;
int week = totalDay % 7;//已知1年1月1日是星期日,即模7得1对应的是星期日
for (int i = 0 ; i(week - 17) % 7 ; i) {//如果写成i(week-1)会出现i-1的情况
System.out.print("");//输出开头空白
}
for (int i = 1 ;i = arrLeapYear[month] ;i) {//for循环输出各月天数
System.out.print(i"");
if (i10 ) {//小于10的数补一个空格,以便打印整齐
System.out.print(" ");
}
if (i % 7 == ((7-(week - 1)) % 7 ) || i == arrLeapYear[month]) {//每逢星期六/尾数换行
System.out.println();
}
}
} else {//不是闰年就是平年
for (int i = 0 ; imonth ; i) {//for循环计算出当月之前月份总天数
beforeMonthTotalDay = beforeMonthTotalDayarrNormalYear[i];
}
//判断当月1日是星期几
int totalDay = beforeYearTotalDaybeforeMonthTotalDay1;
int week = totalDay % 7;//已知1年1月1日是星期日,即模7得1对应的是星期日
for (int i = 0 ; i(week - 17) % 7 ; i) {//如果写成i(week-1)会出现i-1的情况
System.out.print("");//输出开头空白
}
for (int i = 1 ;i = arrNormalYear[month] ;i) {//for循环输出各月天数
System.out.print(i"");
if (i10 ) {//小于10的数补一个空格,以便打印整齐
System.out.print(" ");
}
if (i % 7 == ((7-(week - 1)) % 7 ) || i == arrNormalYear[month]) {//每逢星期六/尾数换行
System.out.println();
}
}
}
}
}
显示效果:
java中,一段万年历代码,跑起来总是差4天,修改之后也只能让一部分月份的显示正确,代码如下我改造了一下你的代码 :
package com.mikuma.calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class Calendar{
public static void main(String[] args){
int year = 0;
int month = 0;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您要查询的年份");
year = scanner.nextInt();
System.out.println("请输入您要查询的月份");
while (true){
month = scanner.nextInt();
if (month0 || month12){
System.out.println("月份输入有误,请重新输入");
}else{
break;
}
}
printPermanentCalendar(year, month);
}
/**
* 输出万年历
*
* @param year
* @param month
*/
private static void printPermanentCalendar(int year,int month){
int days = 0;
int totaldays = 0;//获取1990年至查询的年份的天数
for (int i = 1900; iyear; i){
totaldays = totaldays(isLeapYear(i) ? 366 : 365);
}
int beforedays = 0;//到指定月份的天数
for (int i = 1; i = month; i){
switch (i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2:
days = isLeapYear(year) ? 29 : 28;
break;
default:
break;
}
if (imonth){
beforedays = beforedaysdays;
}
}
totaldays = totaldaysbeforedays;//总计天数,以判断周几;
int weekDay = 0;
int temp = (1totaldays) % 7;
if (temp == 0){//1990年1月1日星期一 , 据此日0天星期一,以此类推
weekDay = 0;
}else{
weekDay = temp;
}
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
for (int i = 0; iweekDay; i){
System.out.print("\t");
}
for (int i = 1; i = days; i){
System.out.print(i"\t");
if ((totaldaysi) % 7 == 6){
System.out.print("\n");
}
}
}
private static boolean isLeapYear(int year){
return new GregorianCalendar().isLeapYear(year);
}
}
运行:
对比了下 360日历:
结果正确
我们再测试下 2017 年 2月
对比360 日历
也是正确
需要一个java程序,最好是万年历的,要在500行左右的Java-时钟万年历
clock.java代码如下:
/**
* Clock.java
* Summary 数字时间显示
* Created on 2005-8-14
* @author 高?
* remark 如有改动请发一份代码给我,邮箱gkgklovelove@eyou.com
*/
package Clock;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
class Clock extends Canvas implements Runnable{
MainFrame mf;
Thread t;
String time;
Clock(MainFrame mf){
this.mf=mf;
setSize(400,40);
setBackground(Color.white);
t=new Thread(this);//实例化线程
t.start();//调用线程
}
public void run(){
while(true){
try{
t.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.orange);
g.drawString(time,100,25);
}
MainFrame.java 的代码如下:
/**
* MainFrame.java
* Summary 万年历主类
* Created on 2005-8-14
* @author 高?
* remark 如有改动请发一份代码给我 , 邮箱gkgklovelove@eyou.com
*/
package Clock;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
class MainFrame extends JFrame{
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 button=new JButton("查看");
int re_year,re_month;
int x_size,y_size;
String year_num;
Calendar now=Calendar.getInstance();//实例化Calendar
MainFrame(){
super("万年历");
setSize(300,350);
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(y_label);
panel1.add(com1);
panel1.add(m_label);
panel1.add(com2);
panel1.add(button);
for(int i=0;i49;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.white);
Init();
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
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
}});
setContentPane(panel);
setVisible(true);
setResizable(false);
}
public void Init(){
int year,month_num,first_day_num;
String log[]={"日","一","二","三","四","五","六"};
for(int i=0;i7;i){
label[i].setText(log[i]);
}
for(int i=0;i49;i=i 7){
label[i].setForeground(Color.red);//将星期日的日期设置为红色
}
for(int i=6;i49;i=i 7){
label[i].setForeground(Color.green);//将星期六的日期设置为绿色
}
for(int i=1;i10000;i){
com1.addItem("" i);
}
for(int i=1;i13;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_score_log;//判断是否是闰年的标记
int month_day_score;//存储月份的天数
int count;
month_score_log=0;
month_day_score=0;
count=1;
if(year_log%4==0year_log0!=0||year_log@0==0){//判断是否为闰年
month_score_log=1;
}
month_log=month_log 1;//将传来的月份数加1
switch(month_log){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
month_day_score=31;
break;
case 4:
case 6:
case 9:
case 11:
month_day_score=30;
break;
case 2:
if(month_score_log==1){
month_day_score=29;
}
else{
month_day_score=28;
}
break;
}
for(int i=7;i49;i){//初始化标签
label[i].setText("");
}
week_log=week_log 6;//将星期数加6,使显示正确
month_day_score=month_day_score week_log;
for(int i=week_log;imonth_day_score;i,count){
label[i].setText(count "");
}
}
public static void main(String [] args){
JFrame.setDefaultLookAndFeelDecorated(true);
MainFrame start=new MainFrame();
}
}
万年历java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java万年历实验原理、万年历java代码的信息别忘了在本站进行查找喔 。
推荐阅读
- 关于python的text写数据类型的信息
- 企业如何选择营销战略方向,企业应如何选择营销渠道
- 阿里云云服务器联网,阿里云服务器连接不稳定
- mysql数据怎么删除 mysql怎么删除数据库语句
- 电脑硬盘突然消失怎么搞,电脑硬盘东西突然没了能恢复吗
- 益智换衣游戏,换服装的游戏
- mysql操作表命令,mysql操作数据库命令
- go语言搭建博客 go语言实战
- 视频号关注人数怎么看不到,视频号关注了没有显示