1. 程式人生 > >計算一年有多少個周,每個周的開始日期和結束日期是什麼

計算一年有多少個周,每個周的開始日期和結束日期是什麼

 
	/**
	 * 返回指定年度的所有周。List中包含的是String[2]物件<br>
	 * string[0]本週的開始日期,string[1]是本週的結束日期。<br>
	 * 日期的格式為yyyy-MM-dd。<br>
	 * 每年的第一個周,必須包含星期一且是完整的七天。<br>
	 * 例如:2009年的第一個周開始日期為2009-01-05,結束日期為2009-01-11。 <br>
	 * 星期一在哪一年,那麼包含這個星期的周就是哪一年的周。<br>
	 * 例如:2008-12-29是星期一,2009-01-04是星期日,哪麼這個周就是2008年度的最後一個周。<br>
	 * 
	 * @param year 格式 yyyy  ,必須大於1900年度 小於9999年 
	 * @return 
	 */
	public static List<String[]> getWeeksByYear(final int year){
		if(year<1900 || year >9999){
			throw new NullPointerException("年度必須大於等於1900年小於等於9999年");
		}
		//實現思路,首先計算當年有多少個周,然後找到每個周的開始日期和結束日期
		
//		Calendar calendar = new GregorianCalendar();
//		// 在具有預設語言環境的預設時區內使用當前時間構造一個預設的 GregorianCalendar。
//		calendar.setFirstDayOfWeek(Calendar.MONDAY); //設定每週的第一天為星期一
//		calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //每週從週一開始		
//      上面兩句程式碼配合,才能實現,每年度的第一個周,是包含第一個星期一的那個周。		
//		calendar.setMinimalDaysInFirstWeek(7);  //設定每週最少為7天
//		calendar.set(Calendar.YEAR, year); // 設定年度為指定的年

//		//首先計算當年有多少個周,每年都至少有52個周,個別年度有53個周

		int weeks = getWeekNumByYear(year);
//		System.out.println(year+"共有"+weeks+"個周");
		List<String[]> result = new ArrayList<String[]>(weeks);
		for(int i=1;i<=weeks;i++){
			String[] tempWeek = new String[2];
			tempWeek[0] = getYearWeekFirstDay(year,i);
			tempWeek[1] = getYearWeekEndDay (year,i);
//或者使用下面的程式碼,不過發現效率更低			
//			tempWeek[0] = getDateAdd(firstWeekDay,(i-1)*7+0);
//			tempWeek[1] = getDateAdd(firstWeekDay,(i-1)*7+6);			
			result.add(tempWeek);
//			System.out.println(i+"="+tempWeek[0]+"_"+tempWeek[1]);
		}
		return result;
	}

	/**
	 * 計算指定年度共有多少個周。
	 * @param year 格式 yyyy  ,必須大於1900年度 小於9999年 
	 * @return 
	 */
	public static int getWeekNumByYear(final int year){
		if(year<1900 || year >9999){
			throw new NullPointerException("年度必須大於等於1900年小於等於9999年");
		}
		int result = 52;//每年至少有52個周 ,最多有53個周。
		String date = getYearWeekFirstDay(year,53);
		if(date.substring(0, 4).equals(year+"")){ //判斷年度是否相符,如果相符說明有53個周。
			result = 53;
		}
		return result;
	}
	

    /**
     * 計算某年某周的開始日期
     * @param yearNum 格式 yyyy  ,必須大於1900年度 小於9999年 
     * @param weekNum 1到52或者53
     * @return 日期,格式為yyyy-MM-dd
     */
    public static String getYearWeekFirstDay(int yearNum,int weekNum)  {
		if(yearNum<1900 || yearNum >9999){
			throw new NullPointerException("年度必須大於等於1900年小於等於9999年");
		}
	     Calendar cal = Calendar.getInstance();
	     cal.setFirstDayOfWeek(Calendar.MONDAY); //設定每週的第一天為星期一
	     cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//每週從週一開始
//	     上面兩句程式碼配合,才能實現,每年度的第一個周,是包含第一個星期一的那個周。
	     cal.setMinimalDaysInFirstWeek(7);  //設定每週最少為7天     
	     cal.set(Calendar.YEAR, yearNum);
	     cal.set(Calendar.WEEK_OF_YEAR, weekNum);
	    
	     //分別取得當前日期的年、月、日
	     return getFormatDate(cal.getTime());
    }

    /**
     * 計算某年某周的結束日期
     * @param yearNum 格式 yyyy  ,必須大於1900年度 小於9999年 
     * @param weekNum 1到52或者53
     * @return 日期,格式為yyyy-MM-dd
     */
    public static String getYearWeekEndDay(int yearNum,int weekNum)  {
		if(yearNum<1900 || yearNum >9999){
			throw new NullPointerException("年度必須大於等於1900年小於等於9999年");
		}    	
	     Calendar cal = Calendar.getInstance();
	     cal.setFirstDayOfWeek(Calendar.MONDAY); //設定每週的第一天為星期一
	     cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//每週從週一開始
//	     上面兩句程式碼配合,才能實現,每年度的第一個周,是包含第一個星期一的那個周。	     
	     cal.setMinimalDaysInFirstWeek(7);  //設定每週最少為7天         
	     cal.set(Calendar.YEAR, yearNum);
	     cal.set(Calendar.WEEK_OF_YEAR, weekNum);
	     
	     return getFormatDate(cal.getTime());
    }