今天在工作中,需要手动根据新的一年的调休日期,统计输出一年中所有的工作日期。
首先想法是:
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;
}
}