/*程序 1 给定某一年某一天如(1900年一月一日)
* 2计算输入的改天离1900年一月一日相差多少天;
* ①计算输入的那一年到1900有天 润年366 平年365;
* ②计算输入的那一个月到输入的那一年有几天 分四种情况 一个月的天数有31 31 28 29 这四种情况
* ③再加上输入的那一日减去1就是离1900年一月一日
* 3计算那天是周几 对7取模除尽为星期一(如果加1 在对7取模是算的是第1900年1月1号前一天也就是星期日取模)
*
* */
public class Calender {
//起始年份,一月一号是星期几
static int originYear = 1900;
static int firstInWeek = 1;
//一 二 三 四 五 六 七 八 九 十 十一 十二
static int[] daysOfMonthArr ={31,28,31,30,31,30,31,31,30,31,30,31};
//某一年的天数
static int daysOfYear(int pyear){
//可以被四整除的非整百年份 可以被400整除的年份
if ((pyear % 4== 0 && pyear%100 !=0) || pyear % 400 == 0) {
return 366;
}else {
return 365;
}
}
//某一个月的天数 参数为我们想求的哪一个月
static int daysOfMonth(int pmonth,int pyear){
//判断该年是否为润年 润年额二月为29天 平年28
if (daysOfYear(pyear) ==366) {
daysOfMonthArr[1] = 29;
}else{
daysOfMonthArr[1] = 28;
}
//返回用户需要查询的月份(参数传递进来的pmonth)
return daysOfMonthArr[pmonth-1];
}
//画出日历 不需要返回值
static void drawCalander(int pfirstInWeek ,int pdayOfmonth){
String[] arr = new String[42];
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
//将数组初始化为空
for (int i = 0; i < arr.length; i++) {
arr[i] = "";
}
//根据一号是星期几 从一号开始填充直到这个月的天数
for (int j = 0; j < pdayOfmonth; j++) {
//字符串拼接成为字符串
arr[pfirstInWeek +j] = j + 1+"";
}
//画日历
for (int i = 0; i < arr.length; i++) {
//七天换一行
if(i % 7 ==0 && i !=0){
System.out.println();
}
//从日历第一个格开始画,直到42,画满整个日历
System.out.print(arr[i]+"\t");
}
System.out.println("\n-------------------------------------");
}
//得到2010年到用户输入年份呢的天数
static int getDaysPassOfYear(int pyear){
int sum= 0;//总天数
//循环算出 从2010年开始算
for (int i = originYear; i < pyear; i++) {
//把天数累计到sum中
sum +=daysOfYear(i);
}
//把计算的天数返回
return sum;
}
//获取一月到4月份的天数 假如输入5月
static int getDaysPassOfMonth(int pyear,int pmonth){
int sum =0;
//循环累加
for (int i = 1; i < pmonth; i++) {
//累加从一月份开始
sum += daysOfMonth(i, pyear);
}
//把总天数返回
return sum;
}
//得到要显示的月份的一号是星期几
static int getWeek(int pmonth ,int pyear){
int week=0;//要返回的星期几
//假设输入的是2015年5月 计算的是2010,2011,2012,2013,2014年还有2015年的1~4月份
week = (getDaysPassOfMonth(pyear, pmonth)+getDaysPassOfYear(pyear)+firstInWeek)%7;
return week;
}
//展示 日历,用户需要给出哪一年 哪一月
static void showCalander(int pyear,int pmonth){
//getWeek(pmonth, pyear)算出1号星期几,返回int
//daysOfMonth(pmonth, pyear)算出这个月有多少天,返回int
drawCalander(getWeek(pmonth, pyear), daysOfMonth(pmonth, pyear));
}
}
这个类封装几个方法 算出距离1900年一月一日到输入那一年的那一月的1号的天数和星期几
import java.util.Scanner;
public class MyInput {
static Scanner mScanner = new Scanner(System.in);
static int nextInt(){
while (!mScanner.hasNextInt()) {
System.err.println("请输入一个整数");
mScanner.next();
}
int data = mScanner.nextInt();
return data;//或return mScanner.nextInt()
}
static float nextFloat(){
while (!mScanner.hasNextFloat()) {
System.err.println("请输入一个小数");;
mScanner.next();
}
return mScanner.nextFloat();
}
static double nextDouble(){
while (!mScanner.hasNextDouble()) {
System.err.println("请输入double型的数");
mScanner.next();
}
return mScanner.nextDouble();
}
static boolean nextBoolean(){
while (!mScanner.hasNextBoolean()) {
System.err.println("请输入boolean类型");
mScanner.next();
}
return mScanner.nextBoolean();
}
static String next(){
return mScanner.next();
}
}
这是一个过滤的封装类
import java.util.Calendar;
public class Demo {
public static void main(String[] args) {
String userChoice =”“;
//获取系统时间
Calendar mCalendar = Calendar.getInstance();
int year = mCalendar.get(Calendar.YEAR);
//获取系统的时间 比实际时间少了一个月
int month = mCalendar.get(Calendar.MONTH)+1;
do {
Calender.showCalander(year, month);
System.out.println("请输入 1 上个月 2 下个月 3 上一年 4 下一年 5 指定日期 6 退出");
userChoice = MyInput.next();
switch (userChoice) {
case "1":
if (year >= Calender.originYear) {
month--;
//当到达边界的时候一月份的时候 月份回到上一年的12月,
if (month == 0) {
month = 12;
year--;
}
}else {
System.err.println("不支持1900年以前的日历");
}
break;
case "2":
month++;
if (month ==13) {
month =1;
year++;
}
break;
case "3":
year--;
break;
case "4":
year++;
break;
case "5":
//输入的年份不能低于1900
do{
System.out.println("请输入要查询的年份:大于1900");
year = MyInput.nextInt();
}while(year < 1900);
//输入的月份在1月到12月之间
do{
System.out.println("请输入要查询的月份 1 - 12");
month = MyInput.nextInt();
}while(month < 1 || month > 12);
break;
case "6":
break;
default:
break;
}
} while (!userChoice.equals(6));
System.out.println("感谢使用abandon日历 ");
}
}