我的Java學習之路(八)-- 簡易萬年曆

一、功能簡介

  • 主要功能
    • 顯示當前月的日曆,並且標記處當日的日期
    • 顯示前一個月的日曆
    • 顯示後一個月的日曆
    • 顯示去年本月的日曆
    • 顯示明年本月的日曆
    • 顯示用戶輸入的年月的日曆
    • 設置週一還是週日爲每週的第一天

二、功能代碼

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. 輸入1顯示前一個月的日曆
    在這裏插入圖片描述
  3. 輸入2查看下一個月的日曆
    在這裏插入圖片描述
  4. 輸入3顯示去年本月的日曆
    在這裏插入圖片描述
  5. 輸入4顯示明年本月的日曆
    在這裏插入圖片描述
  6. 輸入5顯示用戶輸入的年月的日曆
    在這裏插入圖片描述
  7. 輸入6可以設置週一還是週日爲每週的第一天
    在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章