目录
一、万年历是什么?
万年历在现代生活中具有多种功能与作用,它不仅仅是一个简单的日期查询工具,更是一个综合性的信息查询平台。
首先,万年历可以显示某一年的所有日期和星期,用户输入指定的年份,万年历就能展示出这一年的每一天对应的日期和星期,这对于人们规划日常生活和工作非常有帮助。
其次,万年历还可以计算两个日期之间的天数,这对于需要计算时间间隔的场合非常实用,如旅行规划、项目进度管理等。
此外,万年历还具备节假日查询功能,用户输入特定的日期,万年历就能告诉你这一天是否是节假日,这对于安排出行和休闲活动非常有用。
本文主要是实现第一个功能即:显示某一年的所有日期和星期,用户输入指定的年份,万年历就能展示出这一年的每一天对应的日期和星期。
二、书写思路和运行结果
1.编程思路
我们要编写一个万年历,首先要考虑到如下几点。
(1)每个月有多少天:(我们可以定义一个整数型变量monthdays,用来存放天数。)
1,3,5,7,8,10,12月有31天。
4,6,9,11月有30天。
2月比较特殊:如果是闰年有29天,如果是平年有28天。
代码如下(示例):(我这里直接使用个getDaysByMonth()方法来获取每个月有多少天)
int monthdays=getDaysByMonth( month, year);
getDaysByMonth()方法如下:
public static int getDaysByMonth(int month, int year){
if (month==1 ||month==3 ||month==5 ||month==7 ||month==8 ||month==10 ||month==12 ){
return 31;
} else if (month==4 || month==6 || month==9 || month==11 ) {
return 30;
}else {
return getFlatLeapYear(year)?29:28;
}
}
这里调用了个方法getFlatLeapYear(year)。这个方法是进行闰年的判断。
代码如下():
public static boolean getFlatLeapYear(int year){
if (year%4==0 && year%100!=0 ||year%400==0){
return true;
}else {
return false;
}
}
第一点已经了解了。接下来进行第二点。
(2)我们要计算1900年到我们所输入年份的天数 (我这里使用整数型变量sumyear来存放)
代码块如下:
int sumyear=0;
//1900年1月1日为星期一,从这一天开始计算
for (int i = 1900; i < year; i++) {
sumyear+=getFlatLeapYear(i)?366:365;
}
(3)同样的我们还要知道我们所输入的月份距离1月1日整天数。(这里使用整数型变量summonth来存放)
代码块如下:
int summonth=0;
for (int i = 1; i <month ; i++) {
summonth+=getDaysByMonth(i,year);
}
(4)然后我们计算一下星期几。
代码块如下:
//计算星期几
int week=(summonth+sumyear+1)%7;
(5)最后我们打印一下。
代码块如下:
System.out.println("一\t二\t三\t四\t五\t六\t日");
for (int i = 1; i <=week-1; i++) {
System.out.print("\t");
}
for (int i = 1; i <=monthdays ; i++) {
System.out.print(i+"\t");
if ((summonth+sumyear+i)%7==0){
System.out.println();
}
}
2.源代码合集
//万年历
import java.util.Scanner;
public class Calender {
public static void main(String[] args) {
System.out.println("请输入四位年份:");
Scanner input=new Scanner(System.in);
int year= input.nextInt();
System.out.println("请输入月份:");
int month= input.nextInt();
System.out.println(year+"年"+month+"月");
int monthdays=getDaysByMonth( month, year);
//计算输入年到1900年整年天数
int sumyear=0;
//1900年1月1日为星期一,从这一天开始计算
for (int i = 1900; i < year; i++) {
sumyear+=getFlatLeapYear(i)?366:365;
}
//计算输入月份到1月1日整天数
int summonth=0;
for (int i = 1; i <month ; i++) {
summonth+=getDaysByMonth(i,year);
}
//计算星期几
int week=(summonth+sumyear+1)%7;
System.out.println("一\t二\t三\t四\t五\t六\t日");
for (int i = 1; i <=week-1; i++) {
System.out.print("\t");
}
for (int i = 1; i <=monthdays ; i++) {
System.out.print(i+"\t");
if ((summonth+sumyear+i)%7==0){
System.out.println();
}
}
}
// return true;代表闰年
//判断闰年
public static boolean getFlatLeapYear(int year){
if (year%4==0 && year%100!=0 ||year%400==0){
return true;
}else {
return false;
}
}
//获取一个月有多少天
public static int getDaysByMonth(int month, int year){
if (month==1 ||month==3 ||month==5 ||month==7 ||month==8 ||month==10 ||month==12 ){
return 31;
} else if (month==4 || month==6 || month==9 || month==11 ) {
return 30;
}else {
return getFlatLeapYear(year)?29:28;
}
}
}
3.运行结果
运行如下:
总结
主要是通过1900年1月1日这一天为星期一这个已知信息来计算输入年、月到这一天的天数来求星期几。这是主要的编程思路。然后分别统计每个月拥有多少天(这里二月份要单独处理一下。它要进行平年或者闰年的判断。)、距离1900年到输入年份的天数、距离1月1日到输入月份的天数、以及星期几的计算。