今天在工作中,需要手動根據新的一年的調休日期,統計輸出一年中所有的工作日期。
首先想法是:
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;
}
}