java日历程序设计

java日历程序的设计

容错机制很好的一个日历软件设计,里面有详细介绍设计的思想思路。


这是程序设计的显示界面:



下面是我写的全部代码:

package com.xykj.calendar;
import java.util.Scanner;
public class MyCalendar {
/**
* 日历的设计 1、日历的显示:一个日历6行,每周7天,需要创建一个存放42个字符的数组
* 2、月份该显示的天数1、3、5、7、8、10、12显示31天,2月显示平年28,闰年29天 4、6、9、11显示30天
* 3、这个月的第一天是星期几是日历要处理的最关键和最困难的问题!下面详细解释:
* (1)要理解日期的星期数是连续的,比如今天是星期天,明天不管是不是下个月,它都是星期一
* (2)一般日历设计都是从1900年1月1日开始的,这一天是星期一
* (3)那么1月8号也是星期一,相当于距离1900年1月1日的7的所有倍数的天数都是星期一, 这就涉及到求模的问题了,天数总和对7 求模,
* 以此类推,结果为1时,这个月的第一天就是星期二 以此类推,结果为2时,这个月的第一天就是星期三 。。。
* 以此类推,结果为5时,这个月的第一天就是星期六 以此类推,结果为6时,这个月的第一天就是星期天
* (4)接下来就是天数的计算:平年共365天,闰年共366天 (5)接下来举个详细的例子,比如查询2000年的8月的日历
* 这里就要计算1900年1月1日到2000年的8月1日有多少天,求得sumDay sumDay%7求得的结果余几,那么8月1日就是星期(几加1)
* 4、这里为了程序设计得好看,会用方法比较多
* */
static int inputYear;// 输入的年份
static int years = 0;// 输入的年份到1900年经过的年份
static int inputMonth = 0;// 输入的月份
static int inputDay = 0;// 输入的日
static int daySum = 0;// 从1900年1月到所求年月经过的天数总和
static int dayOfYear = 0;// 这一年 的第几天
static Scanner scanner = new Scanner(System.in);
static String isContinue = "4";// 4继续循环输入,否者不会
static int[] monthDayArr = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 一年所有月份的天数


public static void main(String[] args) {
while (isContinue.equals("4")) {// 循环语句
judgeYearAndMonth();// 获取年月
// 封装三个方法(判断天数、显示日历、询问循环)的方法,
// 因为选择上年、下年、上月、下月之后都要用到,所以搞在一起很方便
judgefunction();
}
System.out.println("感谢您的使用!");
}


// 封装三个方法的方法,因为选择上年下年上月下月之后都要用到,所以搞在一起很方便
private static void judgefunction() {
judgeDays();// 计算1900年1月1日到这个月经过了多少天
showCalendar();// 显示日历界面
judgeIscontinue();// 判断是否循环
}


// 判断是否循环的具体代码
private static void judgeIscontinue() {
System.out
.println("***请选择您需要的操作 : 上个月 1 /下个月 3 /上一年5 /下一年2 /4继续输入  /退出0***");
isContinue = scanner.next();
while (!isContinue.equals("0") && !isContinue.equals("1")
&& !isContinue.equals("2") && !isContinue.equals("3")
&& !isContinue.equals("4") && !isContinue.equals("5")) {
System.err
.println("请输入正确的选择 :1上个月  /3下个月  /5上一年 /2下一年 /4继续输入  /0退出 ");
isContinue = scanner.next();
}
switch (isContinue) {
case "1": // 1上个月
inputMonth--;
inputMonth = inputMonth == 0 ? 12 : inputMonth;// 如果输入的是1月的上一月,那么自动变成12月
inputYear = inputMonth == 12 ? --inputYear : inputYear;// 年数也要减1
// 如果输入的是1900年1月是上个月,日期会变成1989年12月,明显是不对的
if (inputYear == 1899) {// 表面看上去页面没动,实际跳转了一次,而且可以继续选择下面的操作
inputMonth = 1;
inputYear = 1900;
System.out.println("你要查询的日历表已经到达程序的极限了!!");
}
inputDay = 1;// 防止当月的天数不够
// 封装三个方法的方法,因为选择上年下年上月下月之后都要用到,所以搞在一起很方便
judgefunction();
break;
case "2": // 2下一年
inputYear++;
// 封装三个方法的方法,因为选择上年下年上月下月之后都要用到,所以搞在一起很方便
judgefunction();
break;
case "3": // 3下个月
inputMonth++;
inputMonth = inputMonth == 13 ? 1 : inputMonth;// 如果输入的是12月的下一月,那么自动变成1月
inputYear = inputMonth == 1 ? ++inputYear : inputYear;// 年数也要加1
inputDay = 1;// 防止当月的天数不够
// 封装三个方法的方法,因为选择上年下年上月下月之后都要用到,所以搞在一起很方便
judgefunction();
break;
case "5": // 5上一年
inputYear--;
if (inputYear == 1899) {
System.err.println("你要查询的日历表已经到达程序的极限了!");
inputYear++;
}
// 封装三个方法的方法,因为选择上年下年上月下月之后都要用到,所以搞在一起很方便
judgefunction();
break;
default:
break;
}
}


// 显示日历界面的具体代码
private static void showCalendar() {
int[] dayArr = new int[42];
if (judgeLeapYear(inputYear)) {
monthDayArr[1] = 29;// 闰年2月29天
}
int firstDay = daySum % 7 + 1;// 这个月前面要留空的天数,加1和1900年1月1日开始有关
// 把这个月每天的天数赋值到数组中
for (int i = 0; i < monthDayArr[inputMonth - 1]; i++) {
dayArr[i + firstDay] = i + 1;
}
System.out.println("\n\n*****");
System.out.println("日历表 ");
System.out
.println("*************************************************************");
System.out.println("\t星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
// 把数组中所有的天数值打印出来,如果值为零用空格替代
for (int i = 0; i < dayArr.length; i++) {
if (dayArr[i] == 0) {
System.out.print("\t" + "   ");
} else {
System.out.print("\t" + dayArr[i]);
}
if ((i + 1) % 7 == 0) {// 这里的数组从第0个数算起
System.out.println();
}
}
String IsLeapYear = judgeLeapYear(inputYear) ? "闰年" : "平年";
System.out.println("*************************************************************");
System.out.print(""+inputYear + " 年 " + inputMonth + " 月  " + inputDay
+ "日    &是" + IsLeapYear + "  &是这年的第" + dayOfYear + "天");
if (!judgeHoliday().equals("")) {
System.out.print("  &是"+judgeHoliday());
}
System.out.print("\n*************************************************************\n");
}


// 计算1900年到这个月经过了多少天的具体代码
private static void judgeDays() {
// 判断这年到1900年结果了多少年
years = inputYear - 1900;
daySum = 0;// 天数总和清零,否则点击下个月会发生天数总和累加
// 因为输入1月,一月还没过去,输入二月的时候一月才算过去
int[] monthDays = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
for (int i = 0; i < inputMonth; i++) {
daySum += monthDays[i];// 累加天数
}
// 这里有一个特殊情况,如果是闰年,并且月份大于3时,天数要加1
if (inputMonth > 2) {
if (judgeLeapYear(inputYear)) {
daySum++;
}
}
dayOfYear = daySum + inputDay;
// 这段时间经过几个闰年
for (int i = 1900; i < inputYear; i++) {// 如果是闰年天数总和加1
if (judgeLeapYear(i)) {
daySum++;
}
}
daySum += 365 * years;// 1900年到查询的年份的1月1日经过的天数
// 每个月的天数,下面的数组是经过某月份的天数和实际的月份相比要后移一位,
// System.out.println("daySum="+daySum);//测试
}


// 判断并获取年月的输入是否合法的具体代码
private static void judgeYearAndMonth() {
System.out
.println("\n****************************************************************");
System.out.println("\t\t欢迎使用完美时代日历\n");
System.out.print("请输入你要查询的年份:");
judgeIsInt();// 排除非整数的输入
inputYear = scanner.nextInt();// 获取输入的年份
while (inputYear < 1900) {// 排除小于1900的数字
System.out.println("请输入不小于1900的数字年份:");
inputYear = scanner.nextInt();// 获取输入的年份
}
System.out.print("请输入你要查询的月份:");
judgeIsInt();// 排除非整数的输入
inputMonth = scanner.nextInt();// 获取输入的月份
while (inputMonth < 1 || inputMonth > 12) {// 排除小于1900的数字
System.out.println("请输入1到12的月份数字:");
inputMonth = scanner.nextInt();// 获取输入的月份
}
System.out.print("请输入你要查询的天数:");
judgeIsInt();// 排除非整数的输入
inputDay = scanner.nextInt();// 获取输入的月份
//输入天数有一点要注意的是,出现该月没有天数
if (judgeLeapYear(inputYear)) {//如果这年是闰年2月的天数是29天
monthDayArr[1]=29;
}
int bigest=monthDayArr[inputMonth-1];//当月会出现的最大值
while (inputDay < 1 || inputDay > bigest) {// 排除小于1900的数字
System.out.println("请输入1到"+bigest+"的天数的数字:");
inputDay = scanner.nextInt();// 获取输入的月份
}
// System.out.println("years=" + years + ",month=" + inputMonth);//测试
}


// 排除非整数的输入的实现代码,否则一直循环输入,直到输入整数
private static void judgeIsInt() {
while (!scanner.hasNextInt()) {// 排除非整数的输入
System.out.println("请输入数字:");
scanner.next();
}


}


// 判断是否是闰年的方法
static boolean judgeLeapYear(int i) {
if ((i % 400 == 0) || (i % 4 == 0) && (i % 100 != 0)) {
return true;
}
return false;
}
//判断重要的节假日,是的话就打印出来,不是就不打印
/*程序只是显示部分重要的节日
* 元旦(1月1日)、元宵节(农历正月十五)
* 妇女节(3月8日)植树节(3月12日)、
* 愚人节(4月1日)、清明节(4月4日)、
* 劳动节(5月1日)、青年节(5月4日)、
* 儿童节(6月1日)、建党节(7月1日)、
* 七夕节(农历七月初七公历8月23日)、建军节(8月1日)、
* 教师节(9月10日)、国庆节(10月1日)、(24日是平安夜)圣诞节、(12月25日)    */
static String judgeHoliday(){
switch (inputMonth) {
case 1:
return inputDay==1?"元旦节":"";
case 3:
return inputDay==8?"妇女节":(inputDay==12?"植树节":"");
case 5:
return inputDay==1?"劳动节":(inputDay==4?"青年节":"");
case 6:
return inputDay==1?"儿童节":"";
case 7:
return inputDay==1?"建党节":"";
case 8:
return inputDay==1?"建军节":(inputDay==23?"七夕节":"");
case 9:
return inputDay==10?"教师节":"";
case 10:
return inputDay==1?"国庆节":"";
case 12:
return inputDay==24?"平安夜":(inputDay==25?"圣诞节":"");
default:
break;
}
return "";
}
}



  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值