Java打印年月日历

一.功能

根据用户输入的年份和月份,在控制台打印出对应月份的日历。

二.算法讲解

要打印一个月的日历只需要知道两件事。

1.这个月第一天是星期几

本例子中,使用蔡勒公式,判断某年某月的一号是周几,关于蔡勒公式不了解的同学可以百度一下,这里不作讲解。
使用"蔡勒公式"计算某月第一天是周几的好处有:
​(1).不用选择参考年月日;
(2)不用计算参考日到计算日的间隔天数;
(3)不用计算一年有多少天。

2.这个月有多少天

使用switch-case语句进行判断,大月31天,小月30天,2月闰年29天,平年28天。

三.源码

import java.util.Scanner;
public class DateUtils{

 /*判断是否为闰年*/
  public boolean isleap(int year){
   return (year%4==0)&&(year%100!=0)||year%400==0;
  }
  /*判断这个月有多少天*/
  public int daysOfmonth(int year,int month){
   switch(month){
   /*大月*/
   case 1:
   case 3:
   case 5:
   case 7:
   case 8:
   case 10:
   case 12:
    return 31;
  /*小月*/
   case 4:
   case 6:
   case 9:
   case 11:
    return 30;
  /*二月*/
   case 2:if(isleap(year)) return 29;
          else return 28;
   default:
    System.out.println("程序错误:输入的月份有误!");
    return 0;
   }
  }
/**
     * 蔡勒公式,判断某年某月的一号是周几
     * @param year 年
     * @param month 月
     * @return week(0,6)
     */
    private int weekOffirst(int year,int month){
        int m=month;
        int d=1;
        if(month<=2){ /*对小于2的月份进行修正*/
            year--;
            m=month+12;
        }
        int y=year % 100;
        int c=year/100;//世纪数减1
        int w=(y+y/4+c/4-2*c+(13*(m+1)/5)+d-1)%7;
        if(w < 0) /*修正计算结果是负数的情况*/
            w+= 7;
        return w;
    }
     /*打印日历*/
     public void dataprint(int year,int month){
      System.out.println("\t\t"+year+"年"+" "+month+"月");
      System.out.println("日\t一\t二\t三\t四\t五\t六");
      int week=weekOffirst(year,month);
      int[][] data = new int[6][7] ;
      int daynum=1;
      for(int i=0;daynum<=daysOfmonth(year,month);i++){
       for(int j=0;j<7&&daynum<=daysOfmonth(year,month);j++){
        if(i==0&&j<week) {
         data[i][j]=0;
         System.out.print("\t");
        }
        else {
         data[i][j]=daynum++;
         System.out.print(data[i][j]+"\t");
        }
       }System.out.println();
      }
     }
     /*主函数入口*/
     public static void main(String[] args){
      DateUtils du=new DateUtils();
      Scanner scn=new Scanner(System.in);
      System.out.print("输入要打印的年:");
      int year=scn.nextInt();
      System.out.print("输入要打印的月:");
      int month=scn.nextInt();
      scn.close();
      du.dataprint(year, month);
     }
}

效果预览

2020年1月

发布了18 篇原创文章 · 获赞 16 · 访问量 1428

猜你喜欢

转载自blog.csdn.net/weixin_44155115/article/details/91509705
今日推荐