一、功能簡介
- 主要功能
- 顯示當前月的日曆,並且標記處當日的日期
- 顯示前一個月的日曆
- 顯示後一個月的日曆
- 顯示去年本月的日曆
- 顯示明年本月的日曆
- 顯示用戶輸入的年月的日曆
- 設置週一還是週日爲每週的第一天
二、功能代碼
MyCalendar.java
package com.feonix;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class MyCalendar {
// 一週的星期數
private static String[][] weeks = { { "日", "一", "二", "三", "四", "五", "六" }, { "一", "二", "三", "四", "五", "六", "日" } };
// 每週第一天的類型:0 => 週日, 1 => 週一
private static int weekType;
// 創建Calendar對象
private static Calendar calendar = Calendar.getInstance();
// 創建鍵盤掃描器
private static Scanner key = new Scanner(System.in);
public static void main(String[] args) {
boolean flag = true;
show(true);
while (flag) {
menu();
int code = key.nextInt();
switch (code) {
case 0:
flag = false;
break;
case 1:
preMonth();
break;
case 2:
nextMonth();
break;
case 3:
preYear();
break;
case 4:
nextYear();
break;
case 5:
setDate();
break;
case 6:
setMyCalendar();
break;
default:
System.out.println("無效的指令,請確認後重試\n");
}
}
key.close();
}
/**
* 顯示操作菜單
*/
private static void menu() {
System.out.println("\n====================================================");
System.out.println("\t1. 查看前一個月的日曆");
System.out.println("\t2. 查看下一個月的日曆");
System.out.println("\t3. 查看去年本月的日曆");
System.out.println("\t4. 查看明年本月的日曆");
System.out.println("\t5. 查看指定年月的日曆");
System.out.println("\t6. 設置日曆");
System.out.println("\t0. 退出日曆");
System.out.println("====================================================");
System.out.println("請選擇:");
}
/**
* 顯示日曆的方法
*/
private static void show(boolean showCurrentDate) {
// 獲取當前Date
Date date = calendar.getTime();
// 創建日期格式化對象
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月");
// 顯示當前年月
System.out.println("\t\t" + dateFormat.format(date) + "\n");
// 循環輸出星期
for (String week : weeks[weekType]) {
System.out.printf(" %s \t", week);
}
// 換個行
System.out.println();
// 獲取指定日期當月天數
int MaxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
// 獲取當前天
int nowDate = calendar.get(Calendar.DATE);
// 設置爲當前月的第一天
calendar.set(Calendar.DATE, 1);
// 獲取當前月第一天星期幾
int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
// 再把天設置回當前天
calendar.set(Calendar.DATE, nowDate);
// 偏移量
int offset = 0;
if (weekType == 1) {
offset = 1;
if (firstDayOfWeek == 1) {
firstDayOfWeek = 8;
}
}
// 循環打印空格
for (int i = 1; i < firstDayOfWeek - offset; i++) {
System.out.print(" \t");
}
// 循環打印日期
for (int i = 1; i <= MaxDayOfMonth; i++) {
if (i == nowDate && showCurrentDate) {
// 天等於當前天,加上 [ ] 框起來
System.out.printf("[%2d]\t", i);
} else {
System.out.printf(" %2d \t", i);
}
// 天數 + 星期數 - 1 對7取餘爲0則換行
if ((i + firstDayOfWeek - offset - 1) % 7 == 0) {
System.out.println();
}
}
// 最後換行加分割線
System.out.println("\n");
}
/**
* 查看前一個月的日曆
*/
private static void preMonth() {
// 設置到上一個月
calendar.add(Calendar.MONTH, -1);
// 輸出日曆
show(false);
// 設置回當前月
calendar.add(Calendar.MONTH, 1);
}
/**
* 查看後一個月的日曆
*/
private static void nextMonth() {
// 設置到下一個月
calendar.add(Calendar.MONTH, 1);
// 輸出日曆
show(false);
// 設置回當前月
calendar.add(Calendar.MONTH, -1);
}
/**
* 查看去年本月的日曆
*/
private static void preYear() {
// 設置到去年
calendar.add(Calendar.YEAR, -1);
// 輸出日曆
show(false);
// 設置回當前年
calendar.add(Calendar.YEAR, 1);
}
/**
* 查看明年本月的日曆
*/
private static void nextYear() {
// 設置到明年
calendar.add(Calendar.YEAR, 1);
// 輸出日曆
show(false);
// 設置回當前年
calendar.add(Calendar.YEAR, -1);
}
/**
* 設置日期爲用戶輸入的日期,用於顯示用戶想要查看的月份的日曆
*/
private static void setDate() {
// 創建日期格式化對象
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
Date date = null;
// 獲取當前年
int nowYear = calendar.get(Calendar.YEAR);
// 獲取當前月
int nowMonth = calendar.get(Calendar.MONTH);
// 獲取當前天
int nowDay = calendar.get(Calendar.DATE);
// 提示用戶輸入,並把當前年月作爲示例
System.out.println("請輸入要查看的年月,例如:" + dateFormat.format(calendar.getTime()));
// 接收用戶輸入的日期
String sdate = key.next();
try {
// 把String類型的日期轉化Date類型的
date = dateFormat.parse(sdate);
} catch (ParseException e) {
e.printStackTrace();
}
// 設置日期爲用戶輸入的
calendar.setTime(date);
// 輸出日曆
show(false);
// 設置回當前年
calendar.set(Calendar.YEAR, nowYear);
// 設置回當前月
calendar.set(Calendar.MONTH, nowMonth);
// 設置天數爲當前天
calendar.set(Calendar.DATE, nowDay);
}
/**
* 設置日曆
*/
private static void setMyCalendar() {
System.out.println("請選擇一週的第一天是周幾:(0. 週日, 1. 週一)");
// 獲取當前的weekType,防止用戶亂輸入導致數組越界
int curWeekType = weekType;
// 獲取用戶輸入的值
weekType = key.nextInt();
if (weekType > 1 || weekType < 0) {
// 如果用戶亂輸入,則把之前的賦值回去
weekType = curWeekType;
System.out.println("無效的選擇,請確認後重試\n");
return;
}
// 輸出日曆
show(true);
}
}
三、功能演示圖
- 開始時顯示當前月的日曆
- 輸入1顯示前一個月的日曆
- 輸入2查看下一個月的日曆
- 輸入3顯示去年本月的日曆
- 輸入4顯示明年本月的日曆
- 輸入5顯示用戶輸入的年月的日曆
- 輸入6可以設置週一還是週日爲每週的第一天