java日历源码

java日历

闰年(二月为二十九天,一年就三百六十六天,年份能被4整除但不能被100整除的或者能被400整除的是闰年),平年(二月为二十八天,一年三百六十五天)

蔡勒(Zeller)公式是一个计算星期的公式.随便给一个日期,就能用这个公式推算出是星期几.蔡勒公式如下:

w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 

公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。(C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月要按上一年的13月和 14月来算,这时C和y均按上一年取值。)

算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。

然后是java日历的源码:


package calendar;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        System.out.print("请输入年份:");
        int year=input.nextInt();
        System.out.print("请输入月份:");
        int month=input.nextInt();
        input.close();
        if(month==2)
        {
            //闰年month有29天
            if((year%4==0&&year%400!=0)||year%100==0)
            {
                reinforcePrintf(year-1,14,29);
            }
            //平年month有28天
            else {
                reinforcePrintf(year-1,14,28);
            }
        }else {
            //小月day有30天
            if(month==4||month==6||month==9||month==11)
            {
                reinforcePrintf(year,month,30);
            }
            //大月day有31天
            else {
                //是否是1月
                if(month==1)
                {
                    reinforcePrintf(year-1,13,31);
                }
                else {
                    reinforcePrintf(year,month,31);
                }
            }
        }
    }

    //打印日历的方法
    private static void reinforcePrintf(int year,int month,int day)
    {
        System.out.println(year+"年"+month+"月的日历为:\n");
        int center=year/100;
        year=year-center*100;
        int w=year+year/4+center/4-2*center+(13*(month+1))/5;//计算某年某月一日的星期
        w=w%7;
        System.out.println("天\t一\t二\t三\t四\t五\t六\t");//打印日历表头
        int j=1;//j在这里记录1到day打印到了哪里
        for(int i=0;i<=6;i++)//根据w开始打印日历的第一行
        {
            if(i<w)
            {
                System.out.print(" \t");//在w之前没有记录
            }else {
                System.out.print(j+"\t");//在w之后,打印day的记录j
                j++;
            }
        }
        System.out.print("\n");//转到日历的下一行
        for(center=j,j=1;center<=day;center++)//在这里center表示剩下的j到day打印到了哪里,j记录一行只打印7个
        {
            System.out.print(center+"\t");//打印日历当前记录center
            j++;
            if(j>7)//每打印完7个换行
            {
                j=j%7;
                System.out.print("\n");
            }
        }
    }
}


测试结果如下:


源码属于个人原创,没有参照任何代码,但某些知识概念有所借鉴




  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值