服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - JAVA教程 - Java 实现万年历总结

Java 实现万年历总结

2020-06-16 11:22GuNai JAVA教程

这篇文章主要介绍了Java 万年历实现代码的相关资料,需要的朋友可以参考下

一,Java实现万年历的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package calendar;
 
import java.util.Scanner;//日历项目
public class RiLi{
 public static void main(String[] args){
 Scanner A=new Scanner(System.in);
 System.out.println("请输入年份:");
 int year=A.nextInt();
 System.out.println("请输入月份:");
 int month=A.nextInt();
 int sum=0;
 for(int i=1900;i<year;i++){
  if(i%4==0&&i%100!=0||i%400==0){
  sum=sum+366;
  }else{
  sum=sum+365;
  }
 }
 for(int i=1;i<month;i++){
  if(i==2){
  if(year%4==0&&year%100!=0||year%400==0){
   sum=sum+29;}
  else{
   sum=sum+28;
  }
  }else{
  if(i==4||i==6||i==9||i==11){
   sum+=30;
  }else{
   sum+=31;
  }
  }
 }
 sum=sum+1;
 int wekday=sum%7;
 System.out.println("日\t一\t二\t三\t四\t五\t六");
 for(int i=1;i<=wekday;i++){
  System.out.print("\t");
 }
 int f=0;
 if(month==4||month==6||month==9||month==11){
  f=30;}
 if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){f=31;}
 if(month==2){
  if(year%4==0&&year%100!=0||year%400==0){f=29;}
  else{f=28;}
 }
 for(int i=1;i<=f;i++){
  if(sum%7==6){
  System.out.print(i+"\n");
  }else{
  System.out.print(i+"\t");
  }
  sum++;
 }
 }
}
 
 
<br>

二.一个Java万年历,比较简单的那种,显示年月日、星期几、当前日期是第几周、显示闰年、打印万年历等,还可显示当前日期是一年中的第几天,指定日期是星期几等,采用了基姆拉尔森计算公式 ,W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 ,在公式中d表示日期中的日数,m表示月份数,y表示年数。注意:在公式中有个与其他公式不同的地方: 把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
public class myCalendar {
 
  //以下程序段是用来计算输入日期为该年的第几天的
 
  public static int cptDay(int year , int month , int day){
 
    byte dayadd[]={1,-2,1,0,1,0,1,1,0,1,0,1};  //用来存储每个月天数和30的差值
 
    int daycount = 0//这是天数daycount计数器,初始化为0
 
      for(int i=0; i<month-1; i++)
 
        daycount+=(30+dayadd[i]);
 
      daycount+=day;
 
      return (month>2)?daycount+isLeap(year):daycount;
 
  }
 
  //闰年判定程序段,闰年返回1,平年返回0
 
  public static int isLeap(int year){
 
    if((year%400==0)||((year%4==0)&&(year%100!=0)))
 
      return 1;
 
    return 0;
 
  }
 
  //计算输入日期是星期几
 
  //采用了基姆拉尔森计算公式
 
  //W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
 
  //在公式中d表示日期中的日数,m表示月份数,y表示年数。
 
  //注意:在公式中有个与其他公式不同的地方:
 
  //把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
 
  public static int getWeek(int year,int month,int day){
 
    if(month<3)
 
    { month+=12; year--;}
 
    return (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
 
  }
 
  //以下程序段是来计算输入日期为该年第几周的
 
  public static int weekCount(int year,int month,int day){
 
    int dayCnt = cptDay(year,month,day);
 
    int weekminus = getWeek(year,month,day)-getWeek(year,1,1);
 
    int weekCnt = 0;
 
    if(dayCnt%7==0) weekCnt = dayCnt/7+((weekminus>0)?1:0);
 
    else weekCnt = dayCnt/7+((weekminus>0)?2:1);
 
    return weekCnt; 
 
  }
 
  //打印万年历
 
  public static void printCal(int year){
 
    byte dayadd[]={0,1,-2,1,0,1,0,1,1,0,1,0,1}; //同样的,每月天数和30的差值,注意,dadadd[0]的0并没用到
 
    int wkpoint = getWeek(year,1,1);      //wkpoint用来指出当前日期的星期数  
 
    int t = 0;                 //t用来作为一个标记器,解决闰年2月有29天的问题
 
    int bk = 0;                 //bk用来记录需输空白的数目
 
    String week[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
 
    for(int i=1;i<13;i++)
 
    {
 
      t = 0;
 
      bk = 0;
 
      if((i==2)&&(isLeap(year)==1))
 
        t = 1;               //当且仅当闰年的2月份才将其置为1
 
      System.out.println("\n\n\t\t"+year+" 年 "+i+" 月\n");
 
      for(int j=0;j<7;j++)
 
        System.out.print(week[j]+"\t");
 
      System.out.println();
 
      while(bk++<wkpoint)
 
        System.out.print('\t');
 
      for(int j=1;j<=(30+dayadd[i]+t);j++)
 
      {
 
        System.out.print(j+"\t");      //循环输出每月日期
 
        if(wkpoint==6)
 
          { wkpoint = 0; System.out.print('\n');} //当wkpoint计数器为6时将其置为0,并换行
 
        else
 
          wkpoint++;                      
 
      }
 
    }
  }
 
  public static void main(String[] args){
 
    String week[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
 
    System.out.println("输入的日期是该年的第"+cptDay(2009,2,15)+"天");
 
    System.out.println("这一天是该年的第"+weekCount(2009,2,15)+"周 "+week[getWeek(2009,2,15)]);
 
    printCal(2009);
 
  }
 
}

三、

 1.用户输入信息-->进行信息判断(是否符合要求)

2.以1900年1月1日(星期一)为基准,计算1900年1月1日至当日的总天数
   (1)先计算1900年至(用户输入的年 - 1)的总天数   -->注意平闰年之分
   (2)计算用户输入年份的1月至(用户输入月份 - 1)的天数

 3.计算输入月份的第一天是星期几

4.格式化输出

以下我们按照步骤一步一步进行代码解析

一)、利用do-while循环接受用户输入信息,并利用if-else语句进行判断

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int year; 
int month; 
boolean xn = false
do
      System.out.println("请输入年份:"); 
      year = input.nextInt(); 
      System.out.println("请输入月份:"); 
      month = input.nextInt(); 
      //利用boolean类型的表达式进行输入信息的判断 
      xn = (month < 1) || (month > 12) ||(year < 1); 
      if(xn) 
     
         System.out.println("输入信息错误,请重新输入!"); 
     
}while(xn);

二)、判断平闰年,并计算1900年至(用户输入年 - 1)的总天数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int everyYearDay = 0; //每年的天数 
int totalYearsDays = 0; //计算年的天数 
int inputYearDay = 0  //记录用户输入年的天数 
boolean yn = false//标识平闰年 
 
//利用for循环计算天数 
for(int i = 1900;i < =year;i ++) 
   if(((i % 4 == 0)&&(i % 100 != 0))||(i % 400 == 0)) //闰年的判断条件 
   
          yn = true
          everyYearDay = 366
   
   else
  
          yn = false
          everyYearDay = 365
  
  //如果循环中的年份小于用户输入的年份,则累积天数 
 if(i < year) 
   
       totalYearsDays = totalYearsDays + everyYearDay; 
   
   else
   
       inputYearDay = everyYearDay; 
       System.out.println(year + "年共有:" + inputYearDay + "天"); 
   
}

三)、判断月份的天数,并计算当年1月至(用户输入月份 -1)的天数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int everyMonthDay = 0//记录每月的天数 
int totalMonthsDays = 0; //总天数 
int inputMonthDay = 0//记录用户输入的月份在用户输入年份的天数 
 
//利用for循环计算天数 
for(int i = 1;i <= month;i ++) 
   switch(i) 
   
       case 4
       case 6
       case 9
       case 11
            everyMonthDay = 30
            break
       case 2
            if(xn)  //xn是用来记录平闰年的boolean类型的变量 
            
               everyMonthDay = 29
            
            else
           
               everyMonthDay = 28
           
           break
       default
                everyMonthDay = 31
                break
   
   if(i < month) 
  
       totalMonthsDays = totalMonthsDays + everyMonthDay; 
  
  else
  
        inputMonthDay = everyMonthDay; 
        System.out.println(month + "月共有:" + inputMonthDay + "天"); 
  
}

四)、计算总天数,并计算出用户输入的月份的第一天星期几

int total = totalMonthsDays + totalYearsDays; //计算总天数   
int temp = (total + 1) % 7; //判断输入月份的第一天星期几 

五)、格式化输出

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//因为我们的输入格式是 
//星期日 星期一 星期二 星期三 星期四 星期五 星期六 
//当星期日时的时候,我们直接输出就好了,但是当 
//第一天是星期一的时候,我们就必须首先打印出空格 
//然后再输出日期,才能让号码和星期想对应 
//打印空格 
for(int spaceno = 0;spaceno < temp;spaceno ++) 
   System.out.print("/t"); 
 
//按照顺序打印号码 
for(int i = 1;i <= inputMonthDay;i ++) 
   if((total + i ) % 7)   //判断是否该换行了 
   
        System.out.println(i ); 
   
   else
  
         System.out.print(i + "/t"); 
  
}

四、 java(用calendar类)写一个万年历,输入年并且显示当年的日历

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class MyCalendar {
  public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    Calendar c = Calendar.getInstance();
    System.out.println("请输入数字年:(比如 2014)");
    int year = sc.nextInt();
    sc.close();
//   int year = 2014;
    c.set(Calendar.YEAR,year);
     
     
    for (int i = 0; i < 12; i++) {
      c.set(Calendar.MONTH,i); //
      c.set(Calendar.DATE,1); //设置成1月
      printMonth(c);
    }
     
  }
   
  public static void printMonth(Calendar c){
    c.set(Calendar.DAY_OF_MONTH,1);  //设置成一日
    System.out.printf("\n\n========= %s 月 =========\n",c.get(Calendar.MONTH)+1);
    String[] weeks = { "日", "一" , "二", "三", "四", "五", "六" };
    for (int i = 0; i < weeks.length; i++) {
      System.out.printf("%s" + (i != 6 ?"\t":"\n"),weeks[i]);
    }
     
    int offday = c.get(Calendar.DAY_OF_WEEK) - 1;
     
    for(int i = 0; i < offday; i++){
      System.out.printf("\t");
    }
     
    int month = c.get(Calendar.MONTH);
    while(c.get(Calendar.MONTH) == month ){
      System.out.printf("%d" + ( (c.get(Calendar.DAY_OF_WEEK)) != 7 ? "\t":"\n") ,c.get(Calendar.DAY_OF_MONTH));
      c.add(Calendar.DAY_OF_MONTH, 1);
    }
  }
}

 五、程序:万年历+时钟小程序实现

java知识点有:java常用内库与工具(Date类、Calendar类等)、异常(try.....catch)、线程、AWT图形用户界面等基础知识点。

Java 实现万年历总结

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
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());//BorderLayout为边界布局
JPanel panel1=new JPanel();
JPanel panel2=new JPanel(new GridLayout(7,7));//GridLayout为网格布局
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("万年历-Jackbase");
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;i<49;i++){
label=new JLabel("",JLabel.CENTER);//将显示的字符设置为居中
panel2.add(label);
}
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;i<7;i++){
label.setText(log);
}
for(int i=0;i<49;i=i+7){
label.setForeground(Color.red); //将星期日的日期设置为红色
}
for(int i=6;i<49;i=i+7){
label.setForeground(Color.red);//将星期六的日期也设置为红色
}
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_score_log; //判断是否是闰年的标记
int month_day_score; //存储月份的天数
int count;
month_score_log=0;
month_day_score=0;
count=1;
if(year_log%4==0&&year_log%100!=0||year_log%400==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;i<49;i++){ //初始化标签
label.setText("");
}
week_log=week_log+6; //将星期数加6,使显示正确
month_day_score=month_day_score+week_log;
for(int i=week_log;i<month_day_score;i++,count++){
label.setText(count+"");
}
}
 
}
 
 
//创建时钟
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.red);
g.drawString(time,100,25);
}
}
 
 
public class Wnl{
public static void main(String [] args){
JFrame.setDefaultLookAndFeelDecorated(true);
MainFrame start=new MainFrame();
}
}

以上就是Java 实现万年历的资料,希望能帮助实现该功能的朋友,谢谢大家对本站的支持!

延伸 · 阅读

精彩推荐