判断某个月的每一天是否为工作日
生活随笔
收集整理的這篇文章主要介紹了
判断某个月的每一天是否为工作日
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一?前端
<template><div class="app-container"><el-form label-width="120px"><el-form-item label="分配日期"><el-date-pickerv-model="taskDistributionVo.date"type="month"placeholder="選擇日期"format="yyyy 年 MM 月 dd 日"value-format="yyyy-MM"></el-date-picker></el-form-item><el-form-item label="醫(yī)院次數(shù)"><el-input v-model="taskDistributionVo.count1" /></el-form-item><el-form-item label="公司次數(shù)"><el-input v-model="taskDistributionVo.count2" /></el-form-item><el-form-item label="藥房次數(shù)"><el-input v-model="taskDistributionVo.count3" /></el-form-item><el-form-item><el-button type="primary" @click="taskDistribution">任務(wù)分配</el-button></el-form-item></el-form></div> </template><script> // 引入接口定義的 js 文件 import taskDistribution from "@/api/taskDistribution"; export default {data() {return {taskDistributionVo: {}};},methods: {// 添加taskDistribution() {taskDistribution.taskDistribution(this.taskDistributionVo).then(response => {// 提示this.$message({type: "success",message: "任務(wù)分配成功!"});this.taskDistributionVo = {};});}} }; </script>二?后端
1?get 和 post?請(qǐng)求工具類(lèi)
package com.baiyee.sdgt.common.utils;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map;/** * @className: HttpRequest * @description: get 和 post請(qǐng)求 參考 https://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html * @date: 2021/10/19 * @author: cakin */ public class HttpRequest {/*** 向指定URL發(fā)送 GET方法的請(qǐng)求** @param url 發(fā)送請(qǐng)求的URL* @param param 請(qǐng)求參數(shù),請(qǐng)求參數(shù)應(yīng)該是 name1=value1&name2=value2 的形式。* @return URL 所代表遠(yuǎn)程資源的響應(yīng)結(jié)果*/public static String sendGet(String url, String param) {String result = "";BufferedReader in = null;try {String urlNameString = url + "?" + param;URL realUrl = new URL(urlNameString);// 打開(kāi)和URL之間的連接URLConnection connection = realUrl.openConnection();// 設(shè)置通用的請(qǐng)求屬性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 建立實(shí)際的連接connection.connect();// 獲取所有響應(yīng)頭字段Map<String, List<String>> map = connection.getHeaderFields();// 遍歷所有的響應(yīng)頭字段 // for (String key : map.keySet()) { // System.out.println(key + "--->" + map.get(key)); // }// 定義 BufferedReader輸入流來(lái)讀取URL的響應(yīng)in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("發(fā)送GET請(qǐng)求出現(xiàn)異常!" + e);e.printStackTrace();}// 使用finally塊來(lái)關(guān)閉輸入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}/*** 向指定 URL 發(fā)送 POST方法的請(qǐng)求** @param url 發(fā)送請(qǐng)求的 URL* @param param 請(qǐng)求參數(shù),請(qǐng)求參數(shù)應(yīng)該是 name1=value1&name2=value2 的形式。* @return 所代表遠(yuǎn)程資源的響應(yīng)結(jié)果*/public static String sendPost(String url, String param) {PrintWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);// 打開(kāi)和URL之間的連接URLConnection conn = realUrl.openConnection();// 設(shè)置通用的請(qǐng)求屬性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 發(fā)送POST請(qǐng)求必須設(shè)置如下兩行conn.setDoOutput(true);conn.setDoInput(true);// 獲取URLConnection對(duì)象對(duì)應(yīng)的輸出流out = new PrintWriter(conn.getOutputStream());// 發(fā)送請(qǐng)求參數(shù)out.print(param);// flush輸出流的緩沖out.flush();// 定義BufferedReader輸入流來(lái)讀取URL的響應(yīng)in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("發(fā)送 POST 請(qǐng)求出現(xiàn)異常!" + e);e.printStackTrace();}// 使用finally塊來(lái)關(guān)閉輸出流、輸入流finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}return result;} }2?節(jié)假日判斷工具類(lèi)
package com.baiyee.sdgt.common.utils;import com.alibaba.fastjson.JSONObject;import java.text.SimpleDateFormat;import java.text.ParseException; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List;/** * @className: ChineseCalendarUtils * @description: 中國(guó)節(jié)假日工具類(lèi) * @date: 2021/10/19 * @author: cakin */ public class ChineseCalendarUtils {// 法律規(guī)定的放假日期// 此處寫(xiě)死了,政府每年都會(huì)在12月份左右公布,無(wú)法提前預(yù)知private List lawHolidays = Arrays.asList("2017-12-30", "2017-12-31","2018-01-01", "2018-02-15", "2018-02-16", "2018-02-17", "2018-02-18","2018-02-19", "2018-02-20", "2018-02-21", "2018-04-05", "2018-04-06","2018-04-07", "2018-04-29", "2018-04-30", "2018-05-01", "2018-06-16","2018-06-17", "2018-06-18", "2018-09-22", "2018-09-23", "2018-09-24","2018-10-01", "2018-10-02", "2018-10-03", "2018-10-04", "2018-10-05","2018-10-06", "2018-10-07");// 放假需要額外工作的周末private List extraWorkdays = Arrays.asList("2018-02-11", "2018-02-24","2018-04-08", "2018-04-28", "2018-09-29", "2018-09-30");/*** 功能描述:判斷是否是法定假日** @param calendar 日期字符串* @return boolean true:法定節(jié)日 false:非法定節(jié)日* @author cakin* @date 2021/10/19*/public boolean isLawHoliday(String calendar) throws Exception {ChineseCalendarUtils.isValidDate(calendar);if (lawHolidays.contains(calendar)) {return true;}return false;}/*** 功能描述:判斷是否是周末** @param calendar 日期字符串* @return true:是周日 false:不是周日* @author cakin* @date 2021/10/19*/public boolean isWeekends(String calendar) throws Exception {ChineseCalendarUtils.isValidDate(calendar);// 先將字符串類(lèi)型的日期轉(zhuǎn)換為Calendar類(lèi)型SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(calendar);Calendar ca = Calendar.getInstance();ca.setTime(date);if (ca.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY|| ca.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {return true;}return false;}/*** 功能描述:判斷是否是需要額外工作的周末** @param calendar 日期字符串* @return true:需要工作 false:不需要工作* @author cakin* @date 2021/10/19*/public boolean isExtraWorkday(String calendar) throws Exception {ChineseCalendarUtils.isValidDate(calendar);if (extraWorkdays.contains(calendar)) {return true;}return false;}/*** 功能描述:判斷是否是休息日(包含法定節(jié)假日和不需要補(bǔ)班的周末)** @param calendar 日期字符串* @return true:是休息日 false:不是休息日* @author cakin* @date 2021/10/19*/public boolean isHoliday(String calendar) throws Exception {ChineseCalendarUtils.isValidDate(calendar);// 首先法定節(jié)假日必定是休息日if (this.isLawHoliday(calendar)) {return true;}// 排除法定節(jié)假日外的非周末必定是工作日if (!this.isWeekends(calendar)) {return false;}// 所有周末中只有非補(bǔ)班的才是休息日if (this.isExtraWorkday(calendar)) {return false;}return true;}/*** 功能描述:校驗(yàn)字符串是否為指定的日期格式, 含邏輯嚴(yán)格校驗(yàn), 2007/02/30返回false** @param str 時(shí)間字符串* @return true:有效 false:無(wú)效* @author cakin* @date 2021/10/19*/public static boolean isValidDate(String str) {boolean convertSuccess = true;// 指定日期格式為四位年/兩位月份/兩位日期,注意yyyy-MM-dd區(qū)分大小寫(xiě)SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");try {// 設(shè)置lenient為false.// 否則SimpleDateFormat會(huì)比較寬松地驗(yàn)證日期,比如2007/02/29會(huì)被接受,并轉(zhuǎn)換成2007/03/01format.setLenient(false);format.parse(str);} catch (ParseException e) {convertSuccess = false;}return convertSuccess;}/*** 功能描述:功能描述:通過(guò) api 判斷是否為工作日** @param calendar 日期字符串* @return @return true:是工作日 false:不是工作日* @author cakin* @date 2021/10/19* @description: 參考 https://blog.csdn.net/jiangzhongwei_/article/details/118059260*/public static boolean isWorkday(String calendar) {String httpUrl = "http://timor.tech/api/holiday/info/" + calendar;String s = HttpRequest.sendGet(httpUrl, "");try {JSONObject obj = JSONObject.parseObject(s);Integer code = obj.getInteger("code");if (null != code && 0 == code.intValue()) {Integer dayType = obj.getJSONObject("type").getInteger("type");return 0 == dayType.intValue();}} catch (Exception e) {System.out.println("網(wǎng)絡(luò)錯(cuò)誤");}return true;} }3?業(yè)務(wù)層
package com.baiyee.sdgt.obj.service.impl;import com.baiyee.sdgt.common.utils.ChineseCalendarUtils; import com.baiyee.sdgt.model.obj.*; import com.baiyee.sdgt.obj.mapper.TaskMapper; import com.baiyee.sdgt.obj.service.CompanyService; import com.baiyee.sdgt.obj.service.HospitalService; import com.baiyee.sdgt.obj.service.PharmacyService; import com.baiyee.sdgt.obj.service.TaskService; import com.baiyee.sdgt.vo.obj.TaskDistributionVo; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*;/** * @className: TaskServiceImpl * @description: 任務(wù)實(shí)現(xiàn)類(lèi) * @date: 2021/10/4 * @author: cakin */ @Service public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {@Autowiredprivate HospitalService hospitalService;@Autowiredprivate CompanyService companyService;@Autowiredprivate PharmacyService pharmacyService;/*** @className: TaskService* @description: 任務(wù)分配* @date: 2021/10/17* @author: cakin*/@Overridepublic void distributeTask(TaskDistributionVo taskDistributionVo) {List<Task> taskList = new ArrayList<>();// 清空任務(wù)this.getBaseMapper().clearTask();// 初始化任務(wù)initTask(taskDistributionVo, taskList);this.saveBatch(taskList);// 按照省、市、區(qū)排序QueryWrapper<Task> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("PROVINCE", "CITY", "DISTRICT", "COUNT");List<Task> tasks = this.getBaseMapper().selectList(queryWrapper);List<Segment> segments = new ArrayList<>();// 初始化分段initSegment(tasks, segments);// 依據(jù) maxCount 對(duì) segments 降序Collections.sort(segments);List<Task> taskAfterSortList = new ArrayList<>();// 對(duì) tasks 進(jìn)行重排,重排結(jié)果保存到 taskAfterSortListreSortTask(tasks, segments, taskAfterSortList);// 重排后System.out.println("重排后的結(jié)果:");for (Task task : taskAfterSortList) {System.out.println(task);}// 獲得年份String year = taskDistributionVo.getDate().substring(0, 4);// 獲得月份String month = taskDistributionVo.getDate().substring(5, 7);Calendar currentDate = Calendar.getInstance();// 設(shè)置開(kāi)始掃描時(shí)間currentDate.set(Integer.parseInt(year), Integer.parseInt(month) - 1, 1);// 任務(wù)月份int taskMonth = currentDate.get(Calendar.MONTH);while (true) {// 日期字符串表示String calendar = currentDate.get(Calendar.YEAR) + "-" + (currentDate.get(Calendar.MONTH) + 1) + "-" + currentDate.get(Calendar.DATE);ChineseCalendarUtils cc = new ChineseCalendarUtils();System.out.println(calendar + "是否是工作日:" + cc.isWorkday(calendar));// 日期加1天currentDate.add(Calendar.DATE, 1);// 跨月if (taskMonth != currentDate.get(Calendar.MONTH)) {break;}}}/*** 功能描述:對(duì) tasks 進(jìn)行重排** @param tasks 待排序任務(wù)* @return segments 排序分段* @author cakin* @date 2021/10/18*/private void reSortTask(List<Task> tasks, List<Segment> segments, List<Task> taskAfterSortList) {for (Segment segment : segments) {int from = segment.getFrom();int end = segment.getEnd();for (int i = from; i <= end; i++) {taskAfterSortList.add(tasks.get(i));}}}/*** 功能描述:初始化分段** @param tasks 待重排的任務(wù)* @param segments 排序分段* @author cakin* @date 2021/10/18*/private void initSegment(List<Task> tasks, List<Segment> segments) {for (int i = 0; i < tasks.size(); i++) {int headIndex = i;int tailIndex = i + 1;Task tasktHead = tasks.get(headIndex);if (tailIndex == tasks.size()) {Segment segment = new Segment();segment.setFrom(headIndex);segment.setEnd(headIndex);segment.setMaxCount(tasks.get(headIndex).getCount());segments.add(segment);break;}while (true) {Task taskTail;if (tailIndex != tasks.size()) {taskTail = tasks.get(tailIndex);if (!tasktHead.getDistrict().equals(taskTail.getDistrict())) {Segment segment = new Segment();segment.setFrom(headIndex);segment.setEnd(tailIndex - 1);segment.setMaxCount(tasks.get(headIndex).getCount());segments.add(segment);i = tailIndex - 1;break;}} else {Segment segment = new Segment();segment.setFrom(headIndex);segment.setEnd(tasks.size() - 1);segment.setMaxCount(tasks.get(headIndex).getCount());segments.add(segment);i = tasks.size() - 1;break;}tailIndex++;}}}/*** 功能描述:初始化任務(wù)列表** @param taskDistributionVo 前端傳過(guò)來(lái)的任務(wù)* @param taskList 分解后的任務(wù)* @author 貝醫(yī)* @date 2021/10/18*/private void initTask(TaskDistributionVo taskDistributionVo, List<Task> taskList) {// 醫(yī)院拜訪次數(shù)int count1 = taskDistributionVo.getCount1();List<Hospital> hospitalList = hospitalService.list();// 平均每一個(gè)醫(yī)院拜訪次數(shù)int avgHospitalCount = count1 / hospitalList.size();int plusHospitalCount = count1 % hospitalList.size();for (Hospital hospital : hospitalList) {Task task = new Task();task.setName(hospital.getName());task.setProvince(hospital.getProvince());task.setCity(hospital.getCity());task.setDistrict(hospital.getDistrict());task.setType(1);if (plusHospitalCount > 0) {task.setCount(avgHospitalCount + 1);plusHospitalCount--;} else {task.setCount(avgHospitalCount);}taskList.add(task);}// 公司拜訪次數(shù)int count2 = taskDistributionVo.getCount2();List<Company> companyList = companyService.list();// 平均每一個(gè)公司拜訪次數(shù)int avgCompanyCount = count2 / companyList.size();int plusCompanyCount = count2 % companyList.size();for (Company company : companyList) {Task task = new Task();task.setName(company.getName());task.setProvince(company.getProvince());task.setCity(company.getCity());task.setDistrict(company.getDistrict());task.setType(2);if (plusCompanyCount > 0) {task.setCount(avgCompanyCount + 1);plusCompanyCount--;} else {task.setCount(avgCompanyCount);}taskList.add(task);}// 藥房拜訪次數(shù)int count3 = taskDistributionVo.getCount3();List<Pharmacy> pharmacyList = pharmacyService.list();// 平均每一個(gè)藥房拜訪次數(shù)int avgPharmacyCount = count3 / pharmacyList.size();int plusPharmacyCount = count3 % pharmacyList.size();for (Pharmacy pharmacy : pharmacyList) {Task task = new Task();task.setName(pharmacy.getName());task.setProvince(pharmacy.getProvince());task.setCity(pharmacy.getCity());task.setDistrict(pharmacy.getDistrict());task.setType(3);if (plusPharmacyCount > 0) {task.setCount(avgPharmacyCount + 1);plusPharmacyCount--;} else {task.setCount(avgPharmacyCount);}taskList.add(task);}} }三?測(cè)試
1?前端頁(yè)面輸入
2?測(cè)試輸出結(jié)果(2021年10月的工作日只有16天)
?
總結(jié)
以上是生活随笔為你收集整理的判断某个月的每一天是否为工作日的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 算法-发明KMP算法的唐纳德·克努特是怎
- 下一篇: python批量检索文献_Python+