java基础入门教程手写万年历

本文介绍如何使用Java实现万年历功能,包括计算特定年月的天数、确定日期在当年的位置、计算星期以及打印日历的详细步骤。通过实例代码解析每个步骤,适合Java初学者学习。

分析,我们可以分为四个步骤来做

 (1) 给定年月 如:2018-11,计算这个月有多少天

 (2)给定年月日 如:2018-11-1,计算这天是这一年的第多少天呢?

 (3)计算指定年月日是星期几 如2018-11-1是星期几

 (4)打印日历

步骤(1)

分析

给定年月如:2018-11,计算这个月有多少天

给定年月判断这个月有多少天

        31天:1  3    5   7   8   10  12

        30天:4   6   9   11

        28天:2(平年)

        29天:2(闰年)能被400整除,或者能被4整除但是不能被100整除

public static int getMonthDay(int year, int month){
    int days = 0;
    switch (month){
        case 4:
        case 6:
        case 9:
        case 11:
            days = 30;
            break;
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            days = 31;
            break;
        case 2:
            if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){
                days = 29;
            }else{
                days = 28;
            }
            break;
            default:
                System.out.println("输入月份不合法");
                break;
    }

    return days;
}

分析

(2)给定年月日如: 2018-4-10 ,计算这天是这一年的第多少天呢?

如:2018-4-10

 

只要我们计算出来本月之前的每一个月份的天数的和,再加上当月的 天数即可

/**
 * (2)给定年月日如: 2019-4-5 ,计算这天是这一年的第多少天呢?
        1   2   3   4

        31  28  31  5
 *
 */


public static int getYearDays(int year, int month, int day){
    int days = 0;
    for (int i = 1; i < month; i++) {
        days += getMonthDay(year, i);
    }
    days += day;
    return  days;
}

步骤三:

分析

(3)计算指定年月日是星期几 如2018-11-1是星期几

套公式:

int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;

year:当前年

days:指定年月日是这一年的第几天

/**
 * (3)计算指定年月日是星期几    如2018-11-1是星期几
 *
 * int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
 */

public static int getWeek(int year, int  month, int day){
    int days = getYearDays(year, month, day);
    //计算星期的公式
    int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
    return week;
}

步骤(4)

打印日历 分析:给定年月,打印当月日历

总结规律,我们发现每个月1号是星期几,那么

这个月第一行前面就有几个灰色的空,计算出

来空的数量在第一行打印,后面的以此类推的打印,

遇到7的倍数就换行即可。

public static void printData(int year, int month){
    System.out.println("日\t一\t二\t三\t四\t五\t六");
    //获得这个年月的1号的星期
    int week = getWeek(year, month, 1);
    System.out.println();
    int count = 0;
    //打印空白
    for (int i = 0; i < week; i++) {
        count++;
        System.out.print("\t");
 }


    //打印数字,获得这个年月的天数
    int monthDay = getMonthDay(year, month);
    for (int i = 1; i <= monthDay ; i++) {
        count++;
        System.out.print(i+"\t");
        if(count%7 == 0){
            System.out.println();
            System.out.println();
        }
    }
}

完整代码:

package cn.tx.demo;

import java.util.Scanner;

public class Demo1 {


    /**
     * (1) 给定年月如:2018, 11,计算这个月有多少天
     *  30  4 6 9 11
     *
     *  31  1 3 5 7 8 10 12
     *
     *  28  2(平年)
     *
     *  29  2(闰年)   这一年能被400整除, 能被4整除但是不能被100整除
     *
     */

 public static int getMonthDay(int year, int month){
        int days = 0;
        switch (month){
            case 4:
            case 6:
            case 9:
            case 11:
                days = 30;
                break;
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                days = 31;
                break;
            case 2:
                if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){
                    days = 29;
                }else{
                    days = 28;
                }
                break;
                default:
                    System.out.println("输入月份不合法");
                    break;
        }

        return days;
    }


    /**
     * (2)给定年月日如: 2019-4-5 ,计算这天是这一年的第多少天呢?
            1   2   3   4

            31  28  31  5
     *
     */


    public static int getYearDays(int year, int month, int day){
  int days = 0;
        for (int i = 1; i < month; i++) {
            days += getMonthDay(year, i);
        }
        days += day;
        return  days;
    }


    /**
     * (3)计算指定年月日是星期几    如2018-11-1是星期几
     *
     * int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
     */

    public static int getWeek(int year, int  month, int day){
        int days = getYearDays(year, month, day);
        //计算星期的公式
        int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
        return week;
    }


    /**
     *
     日 一  二  三  四  五  六

                        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
     * @param args
     */

    public static void printData(int year, int month){
        System.out.println("日\t一\t二\t三\t四\t五\t六");
        //获得这个年月的1号的星期
 int week = getWeek(year, month, 1);
        System.out.println();
        int count = 0;
        //打印空白
        for (int i = 0; i < week; i++) {
            count++;
            System.out.print("\t");
        }


        //打印数字,获得这个年月的天数
        int monthDay = getMonthDay(year, month);
        for (int i = 1; i <= monthDay ; i++) {
            count++;
            System.out.print(i+"\t");
            if(count%7 == 0){
                System.out.println();
                System.out.println();
            }
        }
    }




    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);


        while (true){
            System.out.println();
            System.out.println();
            System.out.println("请输入yyyy-MM格式的年月获得日历");
            //1999-12
            String s1 = s.nextLine();

            if ("exit".equals(s1)){
                break;
            }
            String[] data = s1.split("-");

            printData(new Integer(data[0]), new Integer(data[1]));
        }
  System.out.println("程序结束");

    }
}

根据本人多年从业以及学习经验,录制了一套最新的Java精讲视频教程,如果你现在也在学习Java,在入门学习Java的过程当中缺乏系统的学习教程,你可以加QQ群654631948领取下学习资料,面试题,开发工具等,群里有资深java老师做答疑,每天也会有基础部分及架构的直播课,也可以加我的微信renlliang2013做深入沟通,只要是真心想学习Java的人都欢迎。

java基础教程:https://ke.qq.com/course/149432?tuin=57912c43


Java分布式互联网架构/微服务/高性能/springboot/springcloud:

https://ke.qq.com/course/179440?tuin=57912c43

 

 

课程内容:本课程是《Java工程师必学系列课程》的第6部分,主要讲解Java语言中中新旧两代日期时间相关的类、日期时间相关的处理方法、历法和时间计算的常识,在课程的最后还安排了万年历实战项目本课程涉及的主要内容可以分为四部分:一、Java语言旧日期时间系统二、Java8新日期时间系统三、日期、时间、历法基础知识四、万年历项目课程说明:在开发Java程序的过程中,无论做什么类型的项目,基本上都会处理与日期和时间相关的问题。既然日期时间问题的处理已经成了程序必须要掌握的技能,那我们就必须认真深入的学习日期时间的计算和处理方法。本课程将深入讲解Java语言新旧两代日期时间系统的相关知识。在讲解的过程中,不仅仅讲解如何调用各种类所提供的方法去处理相关问题,更是从原理上深入分析了这些类的设计原理,以及要如何避免在实战中踩到那些非常隐蔽的大坑。此外,除了讲解日期时间相关工具类的使用,本课程还向广大学员普及了一些必要的日期、时间和历法的相关知识。让学员能够从根本上理解日期时间算法的设计思路。同时,本课程在最后一部分,安排了非常精彩的、完整的万年历项目,通过实战的形式切实帮助学员提高解决具体问题的能力!预期效果:认真学习完本课程,学员可以掌握日期时间计算和处理的相关知识,并能提高实际的编码水平。配套福利:万年历软件的完整源码环境配置要求:学习本课程需安装JDK13或更高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或更高版本的开发工具。因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

renlianggee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值