獲取一年中的工作日期

今天在工作中,需要手動根據新的一年的調休日期,統計輸出一年中所有的工作日期。

首先想法是:

1.獲取一年中的所有日期

2. 將這一年中所有的日期中,過濾掉週六日

3.然後在這些日期中去掉放假的日期

4.然後再添加調休的工作日,最後就是整年的工作日期

注意:需要注意時間格式的問題,自己將休假日期放在一個數組,將調休時間放在一個數組,還要避免數組中有重複的日期。

代碼如下:

package com.wx.stringDate;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.junit.Test;

public class StringDate {
	public static void main(String[] args) throws ParseException{
		//工作的年
		String year = "2020";
		//放假日期數組
		String[] holiday = {"2020-01-01","2020-01-24","2020-01-25","2020-01-26","2020-01-27","2020-01-28",
							"2020-01-29","2020-01-30","2020-04-04","2020-04-05","2020-04-06","2020-05-01",
							"2020-05-02","2020-05-03","2020-05-04","2020-05-05","2020-06-25","2020-06-26",
							"2020-06-27","2020-10-01","2020-10-02","2020-10-03","2020-10-04","2020-10-05",
							"2020-10-06","2020-10-07","2020-10-08"};
		//調休日期數組
		String[] workWeekDay = {"2020-01-19","2020-02-01","2020-04-26",
								"2020-05-09","2020-06-28","2020-09-27",
								"2020-10-10"};
		//str就是最終工作日字符串
		String str = getStringDate(year,holiday,workWeekDay);
		System.out.println(year+"工作日期:"+str);
		
	}
	//將list集合中的工作日期,去掉休假日期,加上調休日期,以字符串形式返回
	public static String getStringDate(String startYear,String[] holiday,String[] workWeekDay){
		List<String> list = toDate(startYear,holiday,workWeekDay);
		String finalString = "";
		if(list.size()>0){
			List<String> finalList = new ArrayList<String>();
			for(int i = 0; i <  list.size(); i++){
				//從工作日中剔除假期
				for(String str : holiday){
					if(list.get(i).equals(str)){
						list.remove(i);
					}
				}
			}
			//將調休的工作日加到list集合中
			for(String str : workWeekDay){
				list.add(str);
			}
			//將最終日期進行排序
			Collections.sort(list);
			//將list集合轉字符串
			
			for(int i = 0; i < list.size(); i++){
				if(i == list.size()-1){
					finalString +=list.get(i);
				}else{
					finalString +=list.get(i)+",";
				}
			}
		}
		
		return finalString;
	}
	//返回一年中除去週六日的所有日期
	public static List<String> toDate(String startYear,String[] holiday,String[] workWeekDay){
		List<String> listDays = new ArrayList<String>();
		Date date = null;
		try {
			//必須數組中時間格式並且時間沒有重複纔可以執行
			if(checkDate(holiday,workWeekDay)&&checkReData(holiday,workWeekDay)){
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
				//遍歷每一年12個月
				for(int i = 1; i <= 12; i++){
					//獲取yyyy-MM這樣的形式
					String year_month = null;
					String str_month = String.valueOf(i);
					if(i < 10){
						str_month = "0"+i;
					}
					year_month = startYear+"-"+str_month;
					date = simpleDateFormat.parse(year_month);
					System.out.println(year_month);
					//獲取每一個月中有多少天
					int count = getDaysOfMonth(date);
					//遍歷一個月中有多少天
					for(int j = 1; j <= count; j++ ){
						String year_month_day = null;
						String str_day = j+"";
						if(j < 10){
							str_day = "0"+j;
						}
						year_month_day = year_month +"-"+str_day; 
						//判斷是否是週六日,週六日返回true
						if(!isdayOfWeek(new SimpleDateFormat("yyyy-MM-dd").parse(year_month_day))){
							listDays.add(year_month_day);
						}
						System.out.println(year_month_day);
					}
					System.out.println("=====================");
				}
				//list的集合中存放的日期
				System.out.println("除去週六日的日期:"+listDays);
			}
			
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return listDays;
	}
	//獲取每個月中有多少天
	public static  int getDaysOfMonth(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
	}
	//判斷日期是週六日
	public static boolean isdayOfWeek(Date date){
		boolean isWeekend = false;
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		isWeekend = calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY;
		return isWeekend;
	}
	//檢查時間格式(時間的位數,時間是否存在例如:2019-02-29)
	public static boolean checkDate(String[] holiday,String[] workWeekDay){
		boolean flag = true;
		try{
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
			SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM");
			//檢測holiday
			for(String str : holiday){
				if(str.length() != 10){
					flag = false;
					 throw new  Exception("holiday中時間格式不對(不是yyyy-MM-dd格式)");
				}
				String year_month = str.substring(0,7);
				String month = str.substring(5,7);
				String day = str.substring(8,str.length());
				if(Integer.parseInt(month)>12){
					flag = false;
					throw new  Exception("holiday中有時間月份超過12(例如:2019-13-xx)");
				}
				int num = getDaysOfMonth(simpleDateFormat2.parse(year_month));
				if(Integer.parseInt(day) > num){
					flag = false;
					throw new  Exception("holiday中有時間天數超過月份的原本天數(例如:2019-12-45,2019-02-29)");
				}
				
				
			}
			//檢測workWeekDay
			for(String str : workWeekDay){
				if(str.length() != 10){
					flag = false;
					throw new  Exception("workWeekDay中時間格式不對(不是yyyy-MM-dd格式)");
				}
				String year_month = str.substring(0,7);
				String month = str.substring(5,7);
				String day = str.substring(8,str.length());
				if(Integer.parseInt(month)>12){
					flag = false;
					throw new  Exception("workWeekDay中有時間月份超過12(例如:2019-13-xx)");
				}
				int num = getDaysOfMonth(simpleDateFormat2.parse(year_month));
				if(Integer.parseInt(day) > num){
					flag = false;
					throw new  Exception("workWeekDay中有時間天數超過月份的原本天數(例如:2019-12-45,2019-02-29)");
				}
				
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return flag;
	}
	//檢查數組中是否有重複時間
	public static boolean checkReData(String[] holiday,String[] workWeekDay){
		boolean flag = true;
		try{
			Set<String> sets1 = new HashSet();
			Set<String> sets2 = new HashSet();
			for(String str : holiday){
				sets1.add(str);
			}
			if(sets1.size() != holiday.length){
				flag = false;
				throw new Exception("holiday中有重複日期,請檢查");
				
			}
			for(String str : workWeekDay){
				sets2.add(str);
			}
			if(sets2.size() != workWeekDay.length){
				flag = false;
				throw new Exception("workWeekDay中有重複日期,請檢查");
				
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return flag;
	}
	
	
}

 

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