package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import org.apache.commons.collections4.CollectionUtils;
import org.javatuples.Pair;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class WeekAndHolidaySuccess {
public static void main(String[] args) {
List holidayDataList = new ArrayList<>();
//获取周
List weekList = new ArrayList<>();
Pair weekDays = WeekDaySuccess.getWeekDays(2024);
Map> daysValueMap = (Map>) weekDays.getValue1();
for(Map.Entry> mapValue:daysValueMap.entrySet()){
List mapValueValue = mapValue.getValue();
if(CollectionUtils.isNotEmpty(mapValueValue)){
weekList.addAll(mapValueValue);
}
}
if(CollectionUtils.isNotEmpty(weekList)){
weekList.stream().forEach(item->{
HolidayData holidayData = new HolidayData();
holidayData.setDataValue(item);
holidayData.setType("week");
holidayData.setTypeName("周末");
holidayDataList.add(holidayData);
});
}
// JSONArray holidayOfYear = HolidayUtils.getHolidayOfYear("2024");
// if(null!=holidayOfYear && holidayOfYear.size()>0){
// for (int i = 0; i < holidayOfYear.size(); i++) {
// HolidayData holidayData = new HolidayData();
// JSONObject jsonObject = holidayOfYear.getJSONObject(i);
// System.out.println(jsonObject.getObject("isOffDay",Boolean.TYPE));
// boolean anyMatchHoliday = weekList.stream().anyMatch(items -> items.equals(jsonObject.getString("date")) && true==jsonObject.getObject("isOffDay",Boolean.TYPE));
// if(!anyMatchHoliday){
// holidayData.setDataValue(jsonObject.getString("date"));
// holidayData.setType("holiday");
// holidayDataList.add(holidayData);
// }
// boolean anyMatchWeek = weekList.stream().anyMatch(items -> items.equals(jsonObject.getString("date")) && false==jsonObject.getObject("isOffDay",Boolean.TYPE));
// if(!anyMatchWeek){
// holidayData.setDataValue(jsonObject.getString("date"));
// holidayData.setType("holiday");
// holidayDataList.add(holidayData);
// }
// }
// }
List holidayValueList = HolidayUtils.getHolidayList("2024");
if(CollectionUtils.isNotEmpty(holidayValueList)){
holidayValueList.stream().forEach(holiday->{
if(true==holiday.getHoliday()){
boolean anyMatchHoliday = weekList.stream().anyMatch(items -> items.equals(holiday.getDate()));
if(!anyMatchHoliday){
HolidayData holidayData = new HolidayData();
holidayData.setDataValue(holiday.getDate());
holidayData.setType("holiday");
holidayData.setTypeName("节假日");
holidayDataList.add(holidayData);
}
}else if(false==holiday.getHoliday()){
boolean anyMatchWeek = weekList.stream().anyMatch(items -> items.equals(holiday.getDate()));
if(anyMatchWeek){
HolidayData holidayData = new HolidayData();
holidayData.setDataValue(holiday.getDate());
holidayData.setType("week");
holidayData.setTypeName("周末");
holidayDataList.remove(holidayData);
}else{
HolidayData holidayData = new HolidayData();
holidayData.setDataValue(holiday.getDate());
holidayData.setType("holiday");
holidayData.setTypeName("节假日");
holidayDataList.add(holidayData);
}
}
});
}
System.out.println("全部节假日及周末:"+holidayDataList);
List weekData = holidayDataList.stream().filter(yryt -> "week".equals(yryt.getType())).collect(Collectors.toList());
System.out.println("全部节周末:"+weekData );
List holidayData = holidayDataList.stream().filter(yryt -> "holiday".equals(yryt.getType())).collect(Collectors.toList());
System.out.println("全部节假日:"+holidayData );
}
}
package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.javatuples.Pair;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import static java.time.temporal.TemporalAdjusters.firstInMonth;
/**
* 获取当前年的星期
*/
public class WeekDaySuccess {
public static void main(String[] args) {
Pair weekDays = getWeekDays(2023);
//System.out.println(weekDays.getValue0());
System.out.println(weekDays.getValue1());
}
public static Pair getWeekDays(int year){
// 创建代表一年中第一天的LocalDate对象。
LocalDate now = LocalDate.of(year, Month.JANUARY, 1);
Map> weekMap = new LinkedHashMap<>(12);
Map> dateWeekMap = new LinkedHashMap<>(12);
// 第一个星期六
LocalDate saturday = now.with(firstInMonth(DayOfWeek.SATURDAY));
do {
String satMonth = String.valueOf(saturday.getMonthValue());
if (CollectionUtils.isEmpty(weekMap.get(satMonth))) {
weekMap.put(satMonth, new ArrayList<>(Arrays.asList(saturday.getDayOfMonth())));
} else {
List values = weekMap.get(satMonth);
values.add(saturday.getDayOfMonth());
Collections.sort(values);
weekMap.put(satMonth, values);
}
// 迭代一个星期
saturday = saturday.plus(Period.ofDays(7));
} while (saturday.getYear() == year);
// 第一个星期天
LocalDate sunday = now.with(firstInMonth(DayOfWeek.SUNDAY));
do {
String sunMonth = String.valueOf(sunday.getMonthValue());
if (CollectionUtils.isEmpty(weekMap.get(sunMonth))) {
weekMap.put(sunMonth, new ArrayList<>(Arrays.asList(sunday.getDayOfMonth())));
} else {
List values = weekMap.get(sunMonth);
values.add(sunday.getDayOfMonth());
Collections.sort(values);
weekMap.put(sunMonth, values);
}
// 迭代一个星期
sunday = sunday.plus(Period.ofDays(7));
} while (sunday.getYear() == year);
Map> sortWeekMap = weekMap.entrySet().stream().sorted((e1, e2) ->
Integer.compare(Integer.parseInt(e1.getKey()), Integer.parseInt(e2.getKey())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
for (Entry> map : sortWeekMap.entrySet()) {
String date = year + "-" +String.format("%02d",Integer.parseInt(map.getKey().trim()));
List integerList = map.getValue();
List weekValue = new ArrayList<>();
integerList.stream().forEach(week->{
weekValue.add(date+"-"+String.format("%02d",week));
});
dateWeekMap.put(date,weekValue);
}
return new Pair(weekMap,dateWeekMap);
}
}
package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.testwar.util.testSenMessage.HttpUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
public class HolidayUtils {
private static final String API_URL = "http://tool.bitefu.net/jiari/?d=";
/**
* 请求第三方接口的方法
* @param url 请求的url
* @return
*/
public static String get(String url, int i) {
// 请求url
URL getUrl = null;
// 连接
HttpURLConnection connection = null;
// 输入流
BufferedReader reader = null;
// 返回结果
StringBuilder lines = new StringBuilder();
try {
// 初始化url
getUrl = new URL(url);
// 获取url的连接
connection = (HttpURLConnection) getUrl.openConnection();
// 发起连接
connection.connect();
// 获取输入流
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
// 读取返回结果
String line = "";
// 读取每一行
while ((line = reader.readLine()) != null) {
// 拼接返回结果
lines.append(line);
}
} catch (IOException e) {
e.printStackTrace();
// 如果请求失败, 尝试重新请求
if (i < 2) {
i++;
try {
System.out.println("第" + i + "次获取失败, 尝试重新请求");
Thread.sleep(3000);
return get(url, i);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
} else {
System.out.println("获取失败, 请检查网络或稍后重试");
}
} finally {
// 在finally中关闭资源
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
return lines.toString();
}
/**
* 设置尝试次数
*
* @param url
* @return
*/
public static String get(String url) {
return get(url, 0);
}
/**
* 获取指定年份的url
*
* @param year 年份
* @return
*/
private static String getPath(String year) {
// 源json地址
//return "https://raw.githubusercontent.com/NateScarlet/holiday-cn/master/" + year + ".json";
// 国内镜像地址
//return "https://natescarlet.coding.net/p/github/d/holiday-cn/git/raw/master/" + year + ".json";
// cdn地址
return "https://cdn.jsdelivr.net/gh/NateScarlet/holiday-cn@master/" + year + ".json";
}
/**
* 获取指定年份的节假日信息
*
* @param year 年份 如:"2022"
* @return
*/
public static JSONArray getHolidayOfYear(String year) {
// 获取指定年份的url
String url = getPath(year);
// 获取返回结果
String json = get(url);
// 解析返回结果
JSONObject jsonObject = JSONObject.parseObject(json);
JSONArray jsonArray = jsonObject.getJSONArray("days");
return jsonArray;
}
/**
* 获取某年所有节假日信息
*/
public static List allHoliday(String yearStr) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String res = get(yearStr);
JSONObject jsonObject = JSONObject.parseArray(res).getJSONObject(0);
List all = new ArrayList<>();
Set daySet = jsonObject.keySet();
for (String s : daySet) {
all.add(dateFormat.format(yearStr + s));
}
return all;
}
/**
* 节假日api
*
* @param dateStr 日期字符串
* @return
*/
private static String getS(String dateStr) {
return HttpUtils.get(API_URL + dateStr,null,null);
}
/**
* 获取指定日期的节假日信息
*
* @param date 日期 如:"2022-04-05"
* @return 如果是节假日, 则isOffDay为true, 否则为false
*/
public static JSONObject getHolidayOfDate(String date) {
// 获取该年份的节假日信息
JSONArray jsonArray = getHolidayOfYear(date.substring(0, 4));
JSONObject result = new JSONObject();
// 遍历节假日信息
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 如果节假日信息中的日期与传入的日期相同,则返回该节假日信息
if (jsonObject.getString("date").equals(date)) {
result = jsonObject;
}
}
if (result.isEmpty()) {
// 如果没有找到该日期的节假日信息,则将该日期的"isOffDay"设置为false
result.put("date", date);
result.put("isOffDay", false);
}
return result;
}
/**
* 判断日期是否节假日的方法
*
* @param date 日期 如:"2022-04-05"
*/
public static boolean isHoliday(String date) {
// 获取该年份的节假日信息
JSONArray jsonArray = getHolidayOfYear(date.substring(0, 4));
// 遍历节假日信息
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 如果传入的日期存在于该年的节假日中,则返回对应的节假日信息(true为节假日, false为调休工作日)
if (jsonObject.getString("date").equals(date)) {
return jsonObject.getBoolean("isOffDay");
}
}
// 如果不存在, 则直接返回false(非节假日)
return false;
}
/**
* 获取指定Date的节假日信息
*
* @param date
* @return
*/
public static JSONObject getHolidayOfDate(Date date) {
// 将Date格式化为String
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return getHolidayOfDate(sdf.format(date));
}
/**
* 判断指定Date是否节假日
*
* @param date
* @return
*/
public static boolean isHoliday(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return isHoliday(sdf.format(date));
}
/**
* 获取从指定日期开始的节假日天数
*
* @param date
* @return
*/
public static int holidayAfterDate(String date, SimpleDateFormat sdf) {
// 日历类
Calendar calendar = Calendar.getInstance();
JSONArray holidayOfYear = getHolidayOfYear(date.substring(0, 4));
int days = 0;
try {
calendar.setTime(sdf.parse(date));
for (int i = 0; i < holidayOfYear.size(); i++) {
JSONObject jsonObject = holidayOfYear.getJSONObject(i);
if (jsonObject.getString("date").equals(date) && jsonObject.getBoolean("isOffDay")) {
days++;
calendar.add(Calendar.DATE, 1);
date = sdf.format(calendar.getTime());
}
}
} catch (ParseException e) {
e.printStackTrace();
}
return days;
}
public static int holidayAfterDate(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return holidayAfterDate(date, sdf);
}
public static int holidayAfterDate(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return holidayAfterDate(sdf.format(date), sdf);
}
/**
* 获取节假日,成功
* @param year
* @return
*/
public static List getHolidayList(String year){
List holidayList = new ArrayList<>();
String data = HttpUtils.get("http://timor.tech/api/holiday/year/"+year+"?type=Y&week=Y",null,null);
JSONObject parseObject = JSONObject.parseObject(data);
Map parseObjectObject = parseObject.getObject("holiday", Map.class);
for(Map.Entry mapValue:parseObjectObject.entrySet()){
JSONObject mapValueValue = mapValue.getValue();
if(null!=mapValueValue){
HolidayValue holidayValue = JSONObject.parseObject(JSON.toJSONString(mapValueValue, SerializerFeature.WriteMapNullValue),HolidayValue.class);
if(null!=holidayValue){
holidayList.add(holidayValue);
}
}
}
List holidayValueList = holidayList.stream().sorted(Comparator.comparing(HolidayValue::getDate, Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
return holidayValueList;
}
// 测试
public static void main(String[] args) {
List holidayList = new ArrayList<>();
List holidayNoList = new ArrayList<>();
String data = HttpUtils.get("http://timor.tech/api/holiday/year/2024?type=Y&week=Y",null,null);
JSONObject parseObject = JSONObject.parseObject(data);
Map parseObjectObject = parseObject.getObject("holiday", Map.class);
for(Map.Entry mapValue:parseObjectObject.entrySet()){
JSONObject mapValueValue = mapValue.getValue();
if(null!=mapValueValue){
HolidayValue holidayValue = JSONObject.parseObject(JSON.toJSONString(mapValueValue, SerializerFeature.WriteMapNullValue),HolidayValue.class);
if(null!=holidayValue){
if(true==holidayValue.getHoliday()){
holidayList.add(holidayValue);
}else{
holidayNoList.add(holidayValue);
}
}
}
}
List holidayValueList = holidayList.stream().sorted(Comparator.comparing(HolidayValue::getDate, Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
System.out.println(holidayValueList.size()+"值:"+holidayValueList);
List holidayNoValueList = holidayNoList.stream().sorted(Comparator.comparing(HolidayValue::getDate, Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
System.out.println(holidayNoValueList.size()+"值:"+holidayNoValueList);
// System.out.println(allHoliday("2024"));
// System.out.println("2022年的节假日: " + getHolidayOfYear("2024"));
// System.out.println("节假日的信息: " + getHolidayOfDate("2022-04-05"));
// System.out.println("节假日调休工作日: " + getHolidayOfDate("2022-04-02"));
// System.out.println("非节假日的信息: " + getHolidayOfDate("2022-04-07"));
// System.out.println("判断一个节假日: " + isHoliday("2022-04-05"));
// System.out.println("判断一个非节假日: " + isHoliday("2022-04-07"));
// System.out.println("自一个节假日起的节假日天数: " + holidayAfterDate("2022-04-04"));
// System.out.println("自非节假日起的节假日天数: " + holidayAfterDate("2022-04-06"));
}
}
package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import lombok.Data;
@Data
public class HolidayValue {
private String date;//日期
private String name;//名称
private Boolean holiday;//是否为节假日
private String target;//描述
}
package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import lombok.Data;
@Data
public class HolidayData {
private String dataValue;//日期
private String type;// 类型
private String typeName;// 类型名称
}