先来看一下效果:
思路:我们发现最简单的日期就是1900年1月1日,当天是星期一,那么可以用这一天推算,先算出输入的年份和月份距离上一个月总共有多少天,并且上个月最后一日是星期几,最后再算出输入月份天数,开始的星期是上一个月最后一日加上一日。
好了,我们开始看看逻辑代码,首先是scanner类,主要接收键盘输入参数:
Scanner scan=new Scanner(System.in);
System.out.println("请输入年份");
int year=scan.nextInt();
System.out.println("请输入月份");
int mouth=scan.nextInt();
得到输入的年份和月份,然后定义打印星期几的数组并输入:
String arr[]=new String[]{"日","一","二","三"
,"四","五","六"};
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
//回车换行,等待真正的日期输出
System.out.println();
定义日期
int Eyear=1900; //最早的年份
int Eday=1; //1900年的第一天是星期一
int sumDay=0; //统计1900年到今年之前共有多少天,不包括到本年本月
首先统计1900年和输入年份总共有多少天,这里涉及当年是不是闰年,判断闰年方法是:当年是不是能被4整除并且不能被100整除,又或者是当年能不能被400整除,那么得到算法。
//判断是否是闰年
public static boolean isT(int year){
if((year%4==0&&year%100!=0)||year%400==0){
return true;
}else{
return false;
}
}
/*
思路: 首先统计上一年到1900年工有多少天,%7取余获得最后一天星期几.
统计1900年到输入的上一年有多少天
*/
for(int i=Eyear;i<year;i++){
if(isT(i)==true){
sumDay+=366;
}else{
sumDay+=365;
}
}
//计算一年之中到这月有多少天
public static int Hday(boolean TF,int mouth){
switch(mouth){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
if(TF){
return 29;
}
return 28;
case 4:
case 6:
case 9:
case 11:
return 30;
}
return 0;
}
//统计今年到这月的日数,,再加上上一年最后的星期几除以7取余
int tDay=0;
for(int i=0;i<mouth;i++){
tDay+=Hday(isT(year),i);
}
//总共多少天到上一个月尾共多少天
sumDay+=tDay;
然后打印空格,星期几就打印多少个空格
//打印空格 上个月月尾是星期几就打印多少个+1空格,因为从星期日开始
for (int i=0;i<=endDay;i++){
System.out.print("\t");
}
统计输入月份的上一个月最后一天是星期几,算法就是,因为1900年的第一日是星期1,所以要从星期1这里开始计算,如果第一天是星期二,那么就是从星期二开始计算,每7日作为一个周期,因为我这里采取的是星期一就是0的开始,所以这里要-1,
//统计到上一个月尾是星期几 0是星期日
int endDay=(Eday-1+sumDay)%7;
然后开始统计输入当月有多少天
//统计今个月有多少天
int Tmouth=Hday(isT(year),mouth);
然后再打印当前月份的星期,开始为上一个月的最后一天星期几加上
int enter=endDay;//换行,从上个月月尾星期开始统计,6+1/7==1就换行,并重置enter
//星期一就等于1
for(int i=1;i<=Tmouth;i++){
System.out.print(i+"\t");
enter+=1;
if((enter+1)%7==0){
System.out.println();
enter=-1;
}
}
完整代码:
import java.util.Scanner;
public class Demo01 {
public static void main(String arg[]){
Scanner scan=new Scanner(System.in);
System.out.println("请输入年份");
int year=scan.nextInt();
System.out.println("请输入月份");
int mouth=scan.nextInt();
// String arr[]=new String[]{"星期日","星期一","星期二","星期三"
// ,"星期四","星期五","星期六"};
String arr[]=new String[]{"日","一","二","三"
,"四","五","六"};
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
//回车换行,等待真正的日期输出
System.out.println();
int Eyear=1900; //最早的年份
int Eday=1; //1900年的第一天是星期一
int sumDay=0; //统计1900年到今年之前共有多少天,不包括到本年本月
/*
思路: 首先统计上一年到1900年工有多少天,%7取余获得最后一天星期几.
统计1900年到输入的上一年有多少天
*/
for(int i=Eyear;i<year;i++){
if(isT(i)==true){
sumDay+=366;
}else{
sumDay+=365;
}
}
//统计今年到这月的日数,,再加上上一年最后的星期几除以7取余
int tDay=0;
for(int i=0;i<mouth;i++){
tDay+=Hday(isT(year),i);
}
//总共多少天到上一个月尾共多少天
sumDay+=tDay;
//统计到上一个月尾是星期几 0是星期日
int endDay=(Eday-1+sumDay)%7;
//System.out.print("endDay="+endDay);
//统计今个月有多少天
int Tmouth=Hday(isT(year),mouth);
//打印空格 上个月月尾是星期几就打印多少个+1空格,因为从星期日开始
for (int i=0;i<=endDay;i++){
System.out.print("\t");
}
//打印开始
int enter=endDay;//换行,从上个月月尾星期开始统计,6+1/7==1就换行,并重置enter
//星期一就等于1
for(int i=1;i<=Tmouth;i++){
System.out.print(i+"\t");
enter+=1;
if((enter+1)%7==0){
System.out.println();
enter=-1;
}
}
//方便看代码名称
System.out.println("");
System.out.println("测试");
System.out.println(sumDay%7);
System.out.println("今年月头到上一个月尾共"+tDay+"天");
System.out.println("1900.1.1到上一个月共有"+sumDay+"天");
System.out.println("上个月最后一天是星期"+endDay);
System.out.println("这个月有"+Tmouth+"天");
}
//判断是否是闰年
public static boolean isT(int year){
if((year%4==0&&year%100!=0)||year%400==0){
return true;
}else{
return false;
}
}
//计算一年之中到这月有多少天
public static int Hday(boolean TF,int mouth){
switch(mouth){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
if(TF){
return 29;
}
return 28;
case 4:
case 6:
case 9:
case 11:
return 30;
}
return 0;
}
}