需求分析
输入一个年份,再输入一个月份,把那个月的日历打印出来
难点
日历空白部分怎么算
如何计算本月一号为周几?
如何计算本月一号之前所有日beforedays
应该是本年之前所有年的日子+本年本月一号之前的日子
步骤
1.计算本年之前所有年的日子
2.计算本年本月一号之前的日子
3.用本月一号之前所有日%7+1=本月一号为周几
4.用对象来代替空白字符串
5.得出本月日历
代码实现
package 日历;
import java.util.ArrayList;
import java.util.List;
public class riliTest {
public static void main(String[] args) {
//创捷集合承接计算后的结果
List<CalendarResponseDto> list=create(1900,2);
//遍历日历集合
for(CalendarResponseDto crd:list){
System.out.println(crd.getYmd());
}
}
public static List<CalendarResponseDto> create(int year,int month){
//用本月一号之前所有日%7+1=本月一号为周几
//如何计算本月一号之前所有日beforedays
//应该是本年之前所有年的日子+本年本月一号之前的日子
//1.计算本年之前所有年的日子
int beforedays=0;
//1900年之后到本年之前的所有日子
for(int i=1900;i<year;i++){
//如果为闰年
if(isRunyears(year)){
//因为闰年一共有366天
beforedays+=366;
}else{
beforedays+=365;
}
}
//上述求得本年之前所有年的日子
//2.计算本年本月一号之前的日子
for(int j=1;j<month;j++){
//遍历本月之前的日子,用calDays方法计算本月有多少天然后累加
beforedays+=calDays(year, j);
}
//此时的本月一号之前所有日beforedays已经算完
//然后计算本月一号周几
//用本月一号之前所有日%7+1=本月一号为周几
int zhouji=beforedays%7+1;
//老外日历周日在前为0
if(zhouji==7){
zhouji=0;
}
//用List来承接本月日历
List<CalendarResponseDto> rili=new ArrayList<>();
//老外日历从0开始遍历某年某月之前空的有多少
for(int k=0;k<zhouji;k++){
//用Crd对象承接空白位置
CalendarResponseDto crd=new CalendarResponseDto();
//先向集合中添加空白
rili.add(crd);
}
//此时空白操作完成
//计算本月有多少天
int days=calDays(year, month);
for(int i=1;i<=days;i++){
//新建一个Dto对象
CalendarResponseDto crd=new CalendarResponseDto();
//用String的valueof方法将int类型转为字符串类型进行拼接
String ymd=String.valueOf(year)+"-"+String.valueOf(month)+"-"+String.valueOf(i);
//用CalendarResponseDto里的setYmd方法设置年月日
crd.setYmd(ymd);
//然后在向集合中添加具体年月日完成日历
rili.add(crd);
}
//返回日历集合完成整个操作
return rili;
}
// 判断某一年是否为闰年
public static boolean isRunyears(int year) {
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return true;
} else
return false;
}
// 判断某一年的某一月有多少天
public static int calDays(int year, int month) {
int days = 0;
switch (month) {
// 31天的
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
// 30天的
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
// 再判断闰年的
case 2:
// 如果是某一年是闰年则当年2月有29天
if (isRunyears(year)) {
days = 29;
} else {
days = 28;
}
break;
}
return days;
}
}