输入年份和月份,输出当年当月的日历
输入输出如下:
主要思路:
1、判断平年闰年并判断2月的天数
2、判断星期几
3、日期与星期的对应,输出
代码如下:
import java.util.Scanner;
public class RiLi {
public static void main(String[] args) {
int sumDay=0;
Scanner in=new Scanner(System.in);
System.out.print("请输入年份:");
int year=in.nextInt();
System.out.print("请输入月份:");
int month=in.nextInt();
System.out.println(year+"年"+month+"月"+"日历如下:");
for(int i=1900;i<year;i++) {
if((i%4==0)&&(i%100!=0)||(i%400==0)) {
sumDay+=366;
}else {
sumDay+=365;
}
}
for(int j=1;j<month;j++) {
if(j==4||j==6||j==9||j==11) {
sumDay+=30;
}else if(j==2) {
if((year%4==0)&&(year%100!=0)||(year%400==0)) {
sumDay+=29;
}else {
sumDay+=28;
}
}else {
sumDay+=31;
}
}
/*以上代码计算1900年1月1号到输入的年月的总天数,如输入2018和8,则计算1900.1.1-2018.7.31的天数*/
int xingQi=(sumDay+1)%7;
/*xingQi用来计算输入的月份1号星期几*/
int everydayXingQi=sumDay+1;
int monthDay;//用来接收每月几天
System.out.println("日\t一\t二\t三\t四\t五\t六");
if(month==4||month==6||month==9||month==11) {
monthDay=30;
}else if(month==2) {
if((year%4==0)&&(year%100!=0)||(year%400==0)) {
monthDay=29;
}else {
monthDay=28;
}
}else {
monthDay=31;
}
for(int i=0;i<xingQi;i++) { //输出每月1号前的空格
System.out.print("\t");
}
for(int i=1;i<=monthDay;i++) { //输出每个月的天数和控制换行
if(everydayXingQi%7==6) {
System.out.print(i+"\n");
}else {
System.out.print(i+"\t");
}
everydayXingQi++;
}
}
}
下面是优化后的代码,更简洁:
import java.io.*;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.*;
public class Test {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
System.out.print("请输入年份:");
int year = in.nextInt();
System.out.print("请输入月份:");
int month = in.nextInt();
System.out.println(year + "年" + month + "月" + "日历如下:");
LocalDate endDate = LocalDate.of(year, month, 1);//设置输入的日期
LocalDate startDate = LocalDate.of(1900, 1, 1);
long sumDay = startDate.until(endDate, ChronoUnit.DAYS);//总相差的天数:3657
/*以上代码计算1900年1月1号到输入的年月的总天数,如输入2018和8,则计算1900.1.1-2018.7.31的天数*/
long xingQi = (sumDay + 1) % 7; //xingQi用来计算输入的月份1号星期几
long everydayXingQi = sumDay + 1;
int monthDay = endDate.lengthOfMonth();//用来接收输入的月份有几天
System.out.println("日\t一\t二\t三\t四\t五\t六");
for (int i = 0; i < xingQi; i++) { //输出每月1号前的空格
System.out.print("\t");
}
for (int i = 1; i <= monthDay; i++) { //输出每个月的天数和控制换行
if (everydayXingQi % 7 == 6) {
System.out.print(i + "\n");
} else {
System.out.print(i + "\t");
}
everydayXingQi++;
}
}
}