使用者輸入一個日期,計算時星期幾,並計算時一年中的某一天,使用自定義方法判斷

緣分丨隨風發表於2015-02-05



說明:這篇部落格是和之前的“使用者輸入一個日期,計算時星期幾,並計算時一年中的某一天,使用正規表示式判斷”,實現的的功能相同,但是這次使用的是,自定義方式來判斷。說實話,之前用正規表示式那種方式的確減少了很多程式碼,但是那個正規表示式理解起來很痛苦,這次這個程式碼雖然多,但是相對好理解一點。


題目編寫程式,該程式啟動後使用者可以按“yyyy-MM-dd”的格式輸入一個日期,程式計算這一天是星期幾,並且計算出是一年中的第幾天。



import java.util.Calendar;
import java.util.Scanner;

public class Test99 {

	public static void main(String[] args) {
		date();
	}

	// 題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
	public static void date() {
		//定義一個陣列,用於存放星期值
		String[] week = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
		// 定義一個變數,用於接收使用者輸入的時間
		// 建立一個Scanner物件
		Scanner sc = new Scanner(System.in);
		System.out.println("請輸入日期:格式:yyyy-MM-dd");
		// 進入死迴圈,接收輸入的年月日,當輸入的日期合法時,結束輸入
		while (true) {
			// 接收使用者輸入
			String str = sc.nextLine();
			//測試日期
//			 String str = "2015-02-05";
			 // 判斷輸入的格式是不是合法,採用正規表示式判斷。
			 String regex = "[0-9]{4}-[0-1][0-9]-[0-3][0-9]";
			 //只能確定判定輸入的格式是不是正確
			if (!str.matches(regex)) {
				System.out.println("輸入格式不合法,請重新輸入");
				//如果當前格式輸入錯誤,提示重新輸入
				continue;
			}
			// 定義一個陣列,用於接收拆分的字串
			String[] s = str.split("-");
			//判斷輸入的資料是否合法,如果不合法將重新輸入,如果合法就繼續下面的計算
			if(!judgeDate(Integer.parseInt(s[0]),Integer.parseInt(s[1])-1,Integer.parseInt(s[2]))){
				System.out.println("輸入資料不合法,請重新輸入");
				continue;
			}
			//定義一個類,獲取時間
			Calendar c = Calendar.getInstance();
			//設定時間為輸入時間,s[0]存放年,s[1]存放月,s[2]存放日。
			//由於輸入的月份是按照我們理解的日期計算【1-12】月,而國外採用的是【0-11】月,所以需要減一
			c.set(Integer.parseInt(s[0]), Integer.parseInt(s[1])-1,
					Integer.parseInt(s[2]));
			//列印結果,獲取時間
			System.out.println("今天是"+s[0]+"的第" + c.get(Calendar.DAY_OF_YEAR) +
					"天\t"+week[c.get(Calendar.DAY_OF_WEEK)-1]);
			break;

		}
	}
	
	/*
	 * 功能:判斷輸入的日期是不是合法,
	 * 輸入引數:接收年月日,int year,byte month,byte day
	 * 返回值:返回boolean型別資料,當輸入的值合法時,返回true,否則false
	 * 
	 */
	public static boolean judgeDate(int year,int month,int day){
		Calendar c = Calendar.getInstance();
		//先判斷年份和月份是否合法
		if(year>1900 && (month>=0 && month<12)){
			//判斷是不是月小
			if(month == 3 || month == 5 || month == 8 || month == 10){
//				如果月小的話,日期的時間限制為1-31
				if(day>0 && day<31){
//					滿足要求,將年月日到設定為指定的日期(這裡為當前輸入的日期),並且結束輸入
					c.set(year, month, day);
					return true;
				}
				System.out.println("日期輸入錯誤1!");
				//執行這句,則說明輸入的年、月都正確,但是輸入的日期不合法。
				return false;
			}
			//判斷是不是月大
			else if(month == 0 || month == 2 || month == 4 || month == 6 || month == 7 || month == 9 || month == 11){
//				如果月大的話,日期的時間限制為1-30
				if(day>0 && day<32){
//					滿足要求,將年月日到設定為指定的日期(這裡為當前輸入的日期),並且結束輸入
					c.set(year, month, day);
					return true;
				}
				System.out.println("日期輸入錯誤2!");
				//執行這句,則說明輸入的年、月都正確,但是輸入的日期不合法。
				return false;
			}
//			判斷本年是不是閏年,根據是不是閏年來確定day的值是不是合法
			else if(month == 1){
//				設定當前的時間為三月一日,
				c.set(year, month+1,1);
//				將時間往前推一天,就可以獲取本年二月的最大值
				c.add(Calendar.DAY_OF_MONTH, -1);
//				System.out.println(c.get(Calendar.DAY_OF_MONTH));
				if(day>0 && day<c.get(Calendar.DAY_OF_MONTH)){
					c.set(year, month, day);
					return true;
				}
				System.out.println("日期輸入錯誤3!");
				//執行這句,則說明輸入的年、月都正確,但是輸入的日期不合法。
				return false;
			}
		}
		System.out.println("日期輸入錯誤4!");
		//執行這句,則說明輸入的年、月輸入錯誤。
		return false;
	}


}


執行效果


之前使用正規表示式實現這個功能的:地址:http://blog.csdn.net/lmh820822/article/details/43195677


相關文章