我的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. 开始时显示当前月的日历
    我的Java学习之路(八)-- 简易万年历_第1张图片
  2. 输入1显示前一个月的日历
    我的Java学习之路(八)-- 简易万年历_第2张图片
  3. 输入2查看下一个月的日历
    我的Java学习之路(八)-- 简易万年历_第3张图片
  4. 输入3显示去年本月的日历
    我的Java学习之路(八)-- 简易万年历_第4张图片
  5. 输入4显示明年本月的日历
    我的Java学习之路(八)-- 简易万年历_第5张图片
  6. 输入5显示用户输入的年月的日历
    我的Java学习之路(八)-- 简易万年历_第6张图片
  7. 输入6可以设置周一还是周日为每周的第一天
    我的Java学习之路(八)-- 简易万年历_第7张图片

我的Java学习之路(八)-- 简易万年历_第8张图片

你可能感兴趣的:(Java)