万年历Java(从1900年开始)

关于如何知道当月第一天是周几(假如初始阶段为1900年)
(1900.1.1到你所输入的年份的前一年的总天数+1月份到你所输入的月份之前的一个月的天数+1)%7

package com.at.luming;

import java.util.Scanner;

/**
 * @author :Administrator.
 * @date :2020/2/6 0006
 * @time:18:49
 */
public class Cale {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);

        while(true) {
            System.out.println();
            menu();
            //System.out.println();
            int choose=in.nextInt();
            if (choose == 0) {
                System.exit(0);
            }else if (choose==1) {
                main1();
            }else if (choose==2) {
                main2();
            }else {
                System.out.println("输入错误,重新输入");
            }
        }
    }
    private static void menu() {
        System.out.println("*****************************************************");
        System.out.println("请选择:");
        System.out.println("1:输入当前年月,比如2020 1,以回车键结束打印当前月的日历");
        System.out.println("2:输入当前年,比如2020 以回车键结束打印当前年的日历");
        System.out.println("0:退出");
        System.out.println("*****************************************************");

    }
    /**
     * 判断平闰年
     * @param year
     * @return
     */

    private static boolean isLeapyear(int year) {
        return ((year % 4 == 0)&&(year % 100 != 0))||year % 400 == 0;
    }

    /**
     * 获取该年前一年到1900年的总天数
     * @param year
     * @return
     */
    private static int getTotalFromLastyear(int year){
        int totalDays = 0;
        for(int i = 1900; i< year; i++){//i:年份
            totalDays += isLeapyear(i) ? 366 : 365;
        }
        return totalDays;
    }

    /**
     * 获取每个月的天数
     * @param month
     * @param year
     * @return
     */
    private static int getNowMonth(int year,int month) {
        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12: return 31;
            case 2:return isLeapyear(year)?29:28;
            case 4:
            case 6:
            case 9:
            case 11: return 30;
            default:return 0;
        }
    }
    /**
     * 获取该月前一月到1月的总天数
     * @param month
     * @return
     */
    private static int getTotalFromLastmonth(int year,int month){
        int totalDays = 0;
        for(int i=1;i< month;i++){//i:月份
            totalDays += getNowMonth(year,i);
        }
        return totalDays;
    }

    private static void print(int week,int year,int month) {
        int cnt = 0;//计数器,记录空白数和日期数的和
        //1) 打印表头
        System.out.println("Sun\t\tMon\t\tTue\t\tWed\t\tThr\t\tFri\t\tSat");
        //2)打印空白(观察星期与之前空个数之间的规律)
        for(int i=1;i<= week;i++){
            System.out.print("\t\t");
            cnt++;
        }
        //3) 打印日历
        for(int i=1;i<=getNowMonth(year, month);i++) {
            System.out.print(i + "\t\t");
            cnt++;
            //若记录空白数和日期数的和是七的倍数,应该换行输出
            if (cnt % 7 == 0) {
                System.out.println();
            }
        }
    }

    public static void main1() {
        Scanner input=new Scanner(System.in);
        //2、从控制台接收用户录入的年份、月份
        System.out.println("输入年和月:");

        int year  = input.nextInt();

        int month  = input.nextInt();

        //3、获得1900年距离当前年份上一年的总天数
        int totalDays = getTotalFromLastyear(year);

        //4、获得当前年份所经过的天数
        int totalDaysThisYear = getTotalFromLastmonth(year,month);
        //5、求得给定月份第一天的星期数
        int week = (totalDays + totalDaysThisYear +1) % 7;//星期日是,week = 0

        //6、格式化输出日历
        print(week,year,month);
    }

    public static void main2() {
        Scanner input=new Scanner(System.in);
        //2、从控制台接收用户录入的年份、月份
        System.out.println("输入年:");
        int year  = input.nextInt();

        for (int i = 1; i <=13 ; i++) {
            int totalDays = getTotalFromLastyear(year);

            //4、获得当前年份所经过的天数
            int totalDaysThisYear = getTotalFromLastmonth(year,i);
            //5、求得给定月份第一天的星期数
            int week = (totalDays + totalDaysThisYear +1) % 7;//星期日是,week = 0
            //System.out.println(totalDays+totalDaysThisYear);
            //6、格式化输出日历
            if(i<13) {
                System.out.println("*******"+i+"月"+"*******");
                print(week,year,i);
                System.out.println();
            }

        }
        //3、获得1900年距离当前年份上一年的总天数

    }

}

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值