1. 程式人生 > >java列印萬年曆

java列印萬年曆

我自己寫了三四個小時就是寫不出來前面的空格!!

然後參考這位老哥的,思路清奇,不錯。使用Calendar類實現更方便。見頁末。

package demo01;

import java.util.Scanner;

public class Perpetual {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("請輸入年份:");
		int year = sc.nextInt();
		System.out.println("請輸入月份:");
		int month = sc.nextInt();
		printCalendar(year, month);
	}

	/*
	 * 列印日曆
	 */
	private static void printCalendar(int year, int month) {
		// 打印表頭
		System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
		// 列印數字
		// 1,空格的數量
		int kongGe = getKongGeCount(year, month);
		// 輸出空格
		for (int i = 1; i <= kongGe; i++) {
			System.out.print("\t");
		}
		// 解決當1~7日全為上一月的天數時出現的時間跳轉問題
		if (kongGe == 7) {
			System.out.println();
		}
		// 輸出數字
		for (int i = 1; i <= getDaysOfMonth(year, month); i++) {
			System.out.print(i + "\t");
			if ((i + kongGe) % 7 == 0) {
				System.out.println();
			}
		}
	}

	// 獲取空格的數量
	private static int getKongGeCount(int year, int month) {
		int count = getDaysOfAll(year, month) % 7 + 1;
		return count;
	}

	// 所有的天數
	private static int getDaysOfAll(int year, int month) {
		// 整年的天數 + 整月的天數
		int sum = 0;
		// 1,整年的天數
		for (int i = 1900; i < year; i++) {
			sum += isLoopYear(i) ? 366 : 365;
		}
		// 2,整月的天數
		for (int i = 1; i < month; i++) {
			sum += getDaysOfMonth(year, i);
		}

		return sum;
	}

	/**
	 * 獲取整月的天數
	 * 
	 * @param year
	 * @param month
	 * @return
	 */
	private static int getDaysOfMonth(int year, int month) {
		int day = 0;
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			day = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			day = 30;
			break;
		case 2:
			day = isLoopYear(year) ? 29 : 28;
			break;
		}
		return day;
	}

	// 判斷是否是閏年
	private static boolean isLoopYear(int year) {
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
			return true;
		} else {
			return false;
		}
	}
}

用Calendar類實現

要求:鍵盤輸入一個年份和月份,控制檯輸出當月的日曆

package com.day.zuoye;

import java.util.Scanner;

public class PerpetualCalendar {
	public static void main(String[] args) {
		int x = new Scanner(System.in).nextInt();//輸入年份
		int y = new Scanner(System.in).nextInt() - 1;//輸入月份
		java.util.Calendar cal = java.util.Calendar.getInstance();//獲取Calendar例項
		cal.set(x, y, 1);//把日期年月日設定成輸入的值,其中1為當月第一天的值
		int z = cal.getMaximum(java.util.Calendar.DAY_OF_MONTH);//獲取當月最多有多少天
		int z1 = cal.get(java.util.Calendar.DAY_OF_WEEK);//獲取當月第一天是星期幾,根據返回值判斷。星期一返回值為1,以此類推。
		int kongge = z1-1;//定義空格的數量,通過z1判斷要敲多少個空格--當月第一天為週日時要有六個空格。以此類推。
		int a = 1;//定義非空格的數量
		System.out.println("星期日"+"\t"+"星期一"+"\t"+"星期二"+"\t"+"星期三"+"\t"+"星期四"+"\t"+"星期五"+"\t"+"星期六"+"\t");
		
//		switch (z1) {//通過z1判斷要敲多少個空格--當月第一天為週日時要有六個空格。以此類推。
//		case 1:
//			kongge = 0;
//			break;
//		case 2:
//			kongge = 1;
//			break;
//		case 3:
//			kongge = 2;
//			break;
//		case 4:
//			kongge = 3;
//			break;
//		case 5:
//			kongge = 4;
//			break;
//		case 6:
//			kongge = 5;
//			break;
//		case 7:
//			kongge = 6;
//			break;
//		default:
//			break;
//		}
		//for迴圈打空格
		for (int i = 0; i < kongge; i++) {
			System.out.print("\t");
		}
		//for迴圈列印日期
		for (int i = 1; i <= z; i++) {
			if (a+kongge<7) {//一行中空格和非空格數量小於7就繼續列印
				System.out.print(i+"\t");
				a++;
			}
			else if (a+kongge==7) {//一行中空格和非空格數量等於7就列印換行,同時把空格數置0,非空格數置1,方便下一行判斷。
				System.out.println(i+"\t");
				a=1;
				kongge=0;
			}
			else {
				System.out.println();
			}
		}
	}
}