获取一年中的工作日期

今天在工作中,需要手动根据新的一年的调休日期,统计输出一年中所有的工作日期。

首先想法是:

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;
	}
	
	
}

 

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