用Java实现在控制台输出指定年月的日历
纯算法写太麻烦?Calender对象写可香了:
(万年历二)JAVA在控制台输出万年历(Calendar版)
控制台打印太难看?已更新js控制页面的啦版:
(万年历三)利用js在html页面打印万年历
一、成品效果
- 在控制台输出年份和月份展示如图所示:
二、实现思路
- 1.首先我们知道一个星期有7天,一年有365天(闰年366天),天数%7的余数就是星期几,所以容易想到,我们只需要设置一个已知的年月天的星期,求出相隔的日期取余即可。
- 2.如上图所示,我们可以百度查一下,2019年1月1日是星期二,2019年不是闰年,与2020年1月1日刚好差365天,365%7=1,所以往后推一天,2020年1月1日就是星期三。
- 3.然后我们算出这个月的天数再创建一个7*7的数组,第一行放星期,后面6行放日历每天,就可以把某月的日历保存下来了。
三、代码实现,按步骤:
- 1.静态变量初始化:
//用一个数组也可以,加个闰年判断即可,这里省事用了两个
//非闰年
static int[] daysP = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//闰年
static int[] daysRun = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- 2.闰年判断:
// 判断闰年
public static boolean isRunYear(int year) {
boolean flag = false;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
flag = true;
}
return flag;
}
- 3.获取1900年1月1日(这天是星期一)到year年month月1日有多少天:
// 获取从1900年1月1日到yer年month月1日有多少天
public static int getDaysFrom1990(int year, int month) {
int days = 0;
// 先算出1900年到year-1年的天数
for (int i = 1900; i < year; i++) {
if (isRunYear(i)) {
days += 366;
} else {
days += 365;
}
}
// 再加上year年1月到month-1月的天数,因为月份数组从0开始算
if (isRunYear(year)) {
for (int i = 0; i < month - 1; i++) {
days += daysRun[i];
}
} else {
for (int i = 0; i < month - 1; i++) {
days += daysP[i];
}
}
return days;
}
- 4.将日历算出并输出:
// 获取指定年月的日历 1900.1.1是星期一
public static void getCalendar(int year, int month) {
//日历二维数组
String[][] calender = new String[7][7];
//第一行为星期
calender[0][0] = "一 ";
calender[0][1] = "二 ";
calender[0][2] = "三 ";
calender[0][3] = "四 ";
calender[0][4] = "五 ";
calender[0][5] = "六 ";
calender[0][6] = "日";
//获取天数
int days = getDaysFrom1990(year, month);
//获取星期几,0是星期天
int weekDay= days % 7;
//根据今年是否为闰年来将天数放进二维数组
if(isRunYear(year)) {
days = daysRun[month-1];
}else {
days = daysP[month-1];
}
//存入日历二维数组
int j;
if (weekDay == 0) {
j = 6;
}else {
j = weekDay;
}
int count = 1;
for (int i = 1; i < calender.length; i++) {
if(i!=1) {//第一次外层循环,j按照星期天数定
j = 0;
}
for (; j < calender[0].length; j++) {
calender[i][j] =count+"";
count++;
if (count >= days+1) {
break;
}
}
if (count >= days+1) {
break;
}
}
//输出万年历
//输出第一行
for (int i = 0; i < calender[0].length; i++) {
System.out.print(calender[0][i]+" ");
}
//输出其余行
System.out.println();
for (int i = 1; i < calender.length; i++) {
for (int k = 0; k < calender[0].length; k++) {
if(calender[i][k]==null) {
System.out.print(" ");
}else {
//向左对齐,两字符宽度输出
System.out.printf("%-2d ",(int)Integer.parseInt(calender[i][k]));
}
}
System.out.println();
}
}
四、完整代码:
import java.time.Year;
import java.util.Arrays;
import java.util.Scanner;
//万年历
public class Test10 {
static int[] daysP = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static int[] daysRun = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("===========欢迎来到万年历系统===========");
System.out.println("请输入您需要查询的日历年份:");
int year = sc.nextInt();
if (year < 1900) {
System.out.println("请输入1900年以后的年份");
System.out.println("程序终止........");
return;
}
System.out.println("请输入您需要查询的日历月份:");
int month = sc.nextInt();
if (month < 1 || month > 12) {
System.out.println("请输入1-12中的月份");
System.out.println("程序终止........");
return;
}
System.out.printf("==========%d年%d月的日历为:==========\n",year,month);
getCalendar(year, month);
}
// 判断闰年
public static boolean isRunYear(int year) {
boolean flag = false;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
flag = true;
}
return flag;
}
// 获取从1900年1月1日到yer年month月1日有多少天
public static int getDaysFrom1990(int year, int month) {
int days = 0;
// 先算出1900年到year-1年的天数
for (int i = 1900; i < year; i++) {
if (isRunYear(i)) {
days += 366;
} else {
days += 365;
}
}
// 再加上year年1月到month-1月的天数
if (isRunYear(year)) {
for (int i = 0; i < month - 1; i++) {
days += daysRun[i];
}
} else {
for (int i = 0; i < month - 1; i++) {
days += daysP[i];
}
}
return days;
}
// 获取指定年月的日历 1900.1.1是星期一
public static void getCalendar(int year, int month) {
//日历二维数组
String[][] calender = new String[7][7];
//第一行为星期
calender[0][0] = "一 ";
calender[0][1] = "二 ";
calender[0][2] = "三 ";
calender[0][3] = "四 ";
calender[0][4] = "五 ";
calender[0][5] = "六 ";
calender[0][6] = "日";
//获取天数
int days = getDaysFrom1990(year, month);
//获取星期几,0是星期天
int weekDay= days % 7;
//根据今年是否为闰年来将天数放进二维数组
if(isRunYear(year)) {
days = daysRun[month-1];
}else {
days = daysP[month-1];
}
//存入日历二维数组
int j;
if (weekDay == 0) {
j = 6;
}else {
j = weekDay;
}
int count = 1;
for (int i = 1; i < calender.length; i++) {
if(i!=1) {//第一次外层循环,j按照星期天数定
j = 0;
}
for (; j < calender[0].length; j++) {
calender[i][j] =count+"";
count++;
if (count >= days+1) {
break;
}
}
if (count >= days+1) {
break;
}
}
//输出万年历
//输出第一行
for (int i = 0; i < calender[0].length; i++) {
System.out.print(calender[0][i]+" ");
}
//输出其余行
System.out.println();
for (int i = 1; i < calender.length; i++) {
for (int k = 0; k < calender[0].length; k++) {
if(calender[i][k]==null) {
System.out.print(" ");
}else {
//向左对齐,两字符宽度输出
System.out.printf("%-2d ",(int)Integer.parseInt(calender[i][k]));
}
}
System.out.println();
}
}
}
看完后可以使用Calendar类更简单的输出万年历
JAVA在控制台输出万年历二(Calendar版)