Browse Source

工作日

tall3
zy_Java 4 years ago
parent
commit
407c961da6
  1. 3
      util/src/main/java/com/ccsens/util/cron/NatureConstant.java
  2. 80
      util/src/main/java/com/ccsens/util/cron/NatureToDate.java
  3. 234
      util/src/test/java/com/ccsens/util/DateTest.java

3
util/src/main/java/com/ccsens/util/cron/NatureConstant.java

@ -55,6 +55,7 @@ public class NatureConstant {
public static final String WORKDAY_TIMME = "工作日([0-9"+CHINESE_NUM+"]*)点?小?时?";
public static final String WORKDAY_MONTH = "每月(最后|第)一个工作日";
public static final String WORKDAY_MONTH = "每月最后一个工作日";
public static final String WORKDAY_WEEK = "每周最后一个工作日";
}

80
util/src/main/java/com/ccsens/util/cron/NatureToDate.java

@ -7,6 +7,7 @@ import com.ccsens.util.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
@ -20,8 +21,8 @@ public class NatureToDate {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date start = sdf.parse("2019-09-1 0:00:00");
Date end = sdf.parse("2019-11-2 0:00:00");
Date start = sdf.parse("2021-08-05 0:00:00");
Date end = sdf.parse("2021-11-01 0:00:00");
// System.out.println("每周一:" + generateDates("每周一", start, end));
// System.out.println("每周二:" + generateDates("每周二", start, end));
@ -146,7 +147,12 @@ public class NatureToDate {
taskDates.add(taskDate);
return taskDates;
} else if(StringUtil.isMatch(nature, NatureConstant.WORKDAY_MONTH)){
//每月最后一个工作日
getLastWorkdayByMonth(taskDates,startDate, endDate);
return taskDates;
}else if(StringUtil.isMatch(nature, NatureConstant.WORKDAY_WEEK)){
//每周最后一个工作日
getLastWorkdayByWeek(taskDates,startDate, endDate);
return taskDates;
}
@ -154,6 +160,74 @@ public class NatureToDate {
return null;
}
/**
* 获取每周最后一个工作日
*/
private static void getLastWorkdayByWeek(List<CronConstant.TaskDate> taskDates, Date startDate, Date endDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
while (calendar.getTime().getTime() < endDate.getTime()) {
Date start = calendar.getTime();
calendar.add(Calendar.WEEK_OF_YEAR, 1);
calendar.set(Calendar.DAY_OF_WEEK, 1);
Date end = calendar.getTime().getTime() > endDate.getTime() ? endDate : calendar.getTime();
//获取当月最后一个工作日
getLastWorkday(taskDates,start,end);
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
}
/**
* 获取每月最后一个工作日
*/
private static void getLastWorkdayByMonth(List<CronConstant.TaskDate> taskDates, Date startDate, Date endDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
while (calendar.getTime().getTime() < endDate.getTime()) {
//获取月开始时间
Date start = calendar.getTime();
//获取月结束时间
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 0);
Date end = calendar.getTime().getTime() > endDate.getTime() ? endDate : calendar.getTime();
//获取当月最后一个工作日
getLastWorkday(taskDates,start,end);
//加一个月(为下一个循环)
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
}
}
/**
* 获取指定时间范围内的最后一个工作日
*/
public static void getLastWorkday(List<CronConstant.TaskDate> taskDates, Date startDate, Date endDate) {
DateFormat df = new SimpleDateFormat("MM-dd");
//中国法定节假日期
String isHoliday = "01-01,01-02,01-03,02-11,02-12,02-13,02-14,02-15,02-16,"
+ "02-17,04-03,04-04,04-05,05-01,05-02,05-03,05-04,05-05,06-12,06-13,"
+ "06-14,09-19,09-20,09-21,10-01,10-02,10-03,10-04,10-05,10-06,10-07";
// 节假前后加班日期
String overDay = "02-07,02-20,04-25,05-08,09-18,09-26,10-09";
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
min.setTime(startDate);
max.setTime(endDate);
while (min.before(max)) {
int i = max.get(Calendar.DAY_OF_WEEK);
//是节假前后加班日期 || (不是周末 && 不是节假日)
if (overDay.contains(df.format(max.getTime())) || ((i != 1 && i != 7) && !isHoliday.contains(df.format(max.getTime())))) {
CronConstant.TaskDate taskDate = new CronConstant.TaskDate();
taskDate.setStartDate(DateUtil.getYMD(max.getTime()));
max.add(Calendar.DATE, 1);
taskDate.setEndDate(DateUtil.getYMD(max.getTime()));
taskDates.add(taskDate);
break;
}
max.add(Calendar.DATE, -1);
}
}
/**
* 获取每月第几周的日期
* @param startDate

234
util/src/test/java/com/ccsens/util/DateTest.java

@ -3,92 +3,188 @@ import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import com.alibaba.fastjson.JSONObject;
import com.ccsens.util.cron.CronConstant;
public class DateTest {
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "/" + param;
URL realUrl = new URL(urlNameString);
URLConnection connection = realUrl.openConnection();
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.connect();
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
int cot = 0;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
//
// public static String sendGet(String url, String param) {
// String result = "";
// BufferedReader in = null;
// try {
// String urlNameString = url + "/" + param;
// URL realUrl = new URL(urlNameString);
// URLConnection connection = realUrl.openConnection();
// connection.setRequestProperty("accept", "*/*");
// connection.setRequestProperty("connection", "Keep-Alive");
// connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// connection.connect();
// in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// String line;
// int cot = 0;
// while ((line = in.readLine()) != null) {
// result += line;
// }
// } catch (Exception e) {
// System.out.println("发送GET请求出现异常!" + e);
// e.printStackTrace();
// }
// finally {
// try {
// if (in != null) {
// in.close();
// }
// } catch (Exception e2) {
// e2.printStackTrace();
// }
// }
// return result;
// }
//
// static Map totalMap = new TreeMap();
//
// public static void main(String[] args) throws Exception {
//
// int startYear = 2021;//开始的年份
// int year = 8; //统计的年份
// loop("2021", "8");
//// for(int i = 0; i <= (year - 1); i++){
////// for(int j = 1; j <= 12; j++) {
//// loop(startYear + i + "", j + "");
////// }
//// }
//
// Iterator it = totalMap.keySet().iterator();
// while(it.hasNext()) {
// String temp = (String) it.next();
// System.out.println(temp + " " + totalMap.get(temp));
// }
//
// }
//
// public static void loop(String year, String month) throws Exception {
// String s = DateTest.sendGet("https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query="+year+"%E5%B9%B4"+month+"%E6%9C%88&co=&resource_id=39043&t=1617089428269&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=wisetpl&cb=jQuery110203576901702188473_1617089118772&_=1617089118776", "");
//
// String a = "https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query="+year+"%E5%B9%B4"+month+"%E6%9C%88&co=&resource_id=39043&t=1617089428269&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=wisetpl&cb=jQuery110203576901702188473_1617089118772&_=1617089118776";
// long a1 = System.currentTimeMillis();
// RestTemplateUtil.getForEntity(a,new HashMap<>(),StringBuilder.class);
// System.out.println(System.currentTimeMillis() - a1);
//
// s = s.substring(s.indexOf("("));
// s = s.substring(1, s.length() - 2);
// Map<String, Object> map = (Map<String, Object>) JSONObject.parse(s);
//
// List list = (List) map.get("data");
// Map data = (Map) list.get(0);
// List<Map> almanac = (List<Map>) data.get("almanac");
// if(almanac == null || almanac.size() == 0) {
// return;
// }
//
// for(int i = 1; i < almanac.size(); i++) {
// String key = ((String)almanac.get(i).get("oDate")).substring(0, 10);
// String status = (String)almanac.get(i - 1).get("status");
// if("1".equals(status) || "2".equals(status)) {
// totalMap.put(key, status);
// }
// }
//
// }
/*
*实现思路
*1. 判断指定日期是否掉是双休日
*2. 在通过获取指定日期的 月和日 判断是否是节假
*3. 判断是否有节假日 双休加班情况
*4. 如果上面的你已经了解那么得到工作日就简单了不写了自己通过需求加上
*/
public void isOverDay() { // 指定时间判断是否是双休日
String dates = "2013-05-13"; // 这里可以自定义
DateFormat df = new SimpleDateFormat("yy-MM-dd");
Date d;
try {
d = df.parse("");
if (d.getDay() == 0 || d.getDay() == 6) {
System.out.println("日期:[" + dates + "] 是双休日");
} else {
System.out.println("日期:[" + dates + "] 不是双休日");
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
}
static Map totalMap = new TreeMap();
public static void main(String[] args) throws Exception {
int startYear = 2021;//开始的年份
int year = 8; //统计的年份
loop("2021", "8");
// for(int i = 0; i <= (year - 1); i++){
//// for(int j = 1; j <= 12; j++) {
// loop(startYear + i + "", j + "");
//// }
// }
public static void isHodliDays(List<CronConstant.TaskDate> taskDates, Date startDate, Date endDate) { // 判断是否滴节假日,是否有节假日加班
DateFormat df = new SimpleDateFormat("MM-dd");
//中国法定节假日期
String isHoliday = "01-01,01-02,01-03,02-11,02-12,02-13,02-14,02-15,02-16,"
+ "02-17,04-03,04-04,04-05,05-01,05-02,05-03,05-04,05-05,06-12,06-13,"
+ "06-14,09-19,09-20,09-21,10-01,10-02,10-03,10-04,10-05,10-06,10-07";
// 节假前后加班日期
String overDay = "02-07,02-20,04-25,05-08,09-18,09-26,10-09";
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
min.setTime(startDate);
max.setTime(endDate);
while (min.before(max)) {
int i = max.get(Calendar.DAY_OF_WEEK);
//是调休 || (不是周末 && 不是节假日)
if (overDay.contains(df.format(max.getTime())) || ((i != 1 && i != 7) && !isHoliday.contains(df.format(max.getTime())))) {
System.out.println(df.format(max.getTime())+"工作日");
Iterator it = totalMap.keySet().iterator();
while(it.hasNext()) {
String temp = (String) it.next();
System.out.println(temp + " " + totalMap.get(temp));
CronConstant.TaskDate taskDate = new CronConstant.TaskDate();
taskDate.setStartDate(DateUtil.getYMD(max.getTime()));
max.add(Calendar.DATE, -1);
taskDate.setEndDate(DateUtil.getYMD(max.getTime()));
taskDates.add(taskDate);
break;
}
max.add(Calendar.DATE, -1);
}
}
public static void loop(String year, String month) throws Exception {
String s = DateTest.sendGet("https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query="+year+"%E5%B9%B4"+month+"%E6%9C%88&co=&resource_id=39043&t=1617089428269&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=wisetpl&cb=jQuery110203576901702188473_1617089118772&_=1617089118776", "");
public static void main(String[] args) throws Exception {
List<CronConstant.TaskDate> taskDates = new ArrayList<>();
Date s = new Date(1628148817000L);
Date e = new Date(1633851217000L);
String a = "https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query="+year+"%E5%B9%B4"+month+"%E6%9C%88&co=&resource_id=39043&t=1617089428269&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=wisetpl&cb=jQuery110203576901702188473_1617089118772&_=1617089118776";
long a1 = System.currentTimeMillis();
RestTemplateUtil.getForEntity(a,new HashMap<>(),StringBuilder.class);
System.out.println(System.currentTimeMillis() - a1);
DateFormat df = new SimpleDateFormat("MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(s);
while (calendar.getTime().getTime() < e.getTime()) {
// //获取月开始时间
// Date start = calendar.getTime();
// //获取月结束时间
// calendar.add(Calendar.MONTH, 1);
// calendar.set(Calendar.DAY_OF_MONTH, 0);
// Date end = calendar.getTime().getTime() > e.getTime() ? e : calendar.getTime();
// //获取当月最后一个工作日
// isHodliDays(taskDates,start,end);
// //加一个月(为下一个循环)
// calendar.add(Calendar.MONTH, 1);
// calendar.set(Calendar.DAY_OF_MONTH, 1);
s = s.substring(s.indexOf("("));
s = s.substring(1, s.length() - 2);
Map<String, Object> map = (Map<String, Object>) JSONObject.parse(s);
List list = (List) map.get("data");
Map data = (Map) list.get(0);
List<Map> almanac = (List<Map>) data.get("almanac");
if(almanac == null || almanac.size() == 0) {
return;
}
System.out.println(df.format(calendar.getTime()));
Date start = calendar.getTime();
calendar.add(Calendar.WEEK_OF_YEAR, 1);
calendar.set(Calendar.DAY_OF_WEEK, 1);
Date end = calendar.getTime();
//获取当月最后一个工作日
isHodliDays(taskDates,start,end);
for(int i = 1; i < almanac.size(); i++) {
String key = ((String)almanac.get(i).get("oDate")).substring(0, 10);
String status = (String)almanac.get(i - 1).get("status");
if("1".equals(status) || "2".equals(status)) {
totalMap.put(key, status);
}
}
System.out.println(df.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_MONTH, 1);
System.out.println(df.format(calendar.getTime()));
System.out.println("====================================");
// System.out.println(df.format(calendar.getTime()));
}
System.out.println(taskDates);
}
}
Loading…
Cancel
Save