记录项目中获取日历的代码,仅Java后端,前端页面展示确实不会。需求是只能在本年度初始下一年度日历信息,具体需要初始化的信息都在实体类里。如有错误或不适当的地方请大佬指正。
ps:以下用到了hutool工具包,依赖可去官网贴,获取日历的需要5.4.1以上版本。
1.实体类
@Data
@TableName("pz_work_days")
public class PzWorkDaysEntity implements Serializable {
@TableId(type = IdType.UUID)
private String id;
/**
*年份
*/
private int yearNum;
/**
* 月份
*/
private int monthNum;
/**
* 日期
*/
private String workDay;
/**
* 生肖
*/
private String zodiac;
/**
*甲子年
*/
private String sixtyYear;
/**
*甲子月
*/
private String sixtyMonth;
/**
*甲子日
*/
private String sixtyDay;
/**
*农历日
*/
private String chineseDay;
/**
*周数
*/
private int weekNum;
/**
*星期
*/
private char weekDay;
/**
*节日名称
*/
private String festivalName;
/**
*是否工作日
*/
private char isWeekday;
/**
*备注
*/
private String remarks;
/**
*操作人
*/
private String operateUser;
/**
*操作时间
*/
private Date operateTime;
/**
* 日期 用于排序
*/
@TableField(exist = false)
private int day;
/**
* 假日类型0-普通1-法定2-集中
*/
private String holidayType;
}
2.service层
/**
* 初始化下一年度每月日历
*/
public List<PzWorkDaysEntity> refreshDate(){
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR) + 1;
List<HolidayVo> holidays = this.getHolidays(year);
List<PzWorkDaysEntity> list = new ArrayList<>();
SysUserEntity user = (SysUserEntity) ShiroUtils.getSubject().getPrincipal();
for (int month = 1; month < 13; month++) {
//实例化两个日历对象,一个设置为1900/1/1 一个设置为你要查询的日期
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar1.set(year, month, 1);
calendar2.set(1900, 1, 1);
//月份从0开始
calendar1.set(Calendar.MONTH, month - 1);
int day = getDaysBetween(calendar1, calendar2);
//将天数差%7得到当前月份第一天是星期几
day %= 7;
//如果day%7==0,表示当前月份第一天是星期日
if (day == 0) {
day = 7;
}
int weekNum = 0;
//getActualMaximum 获得该月份中天数的最大值
for (int i = 1; i <= calendar1.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
PzWorkDaysEntity pzWorkDaysEntity = new PzWorkDaysEntity();
pzWorkDaysEntity.setYearNum(year);
pzWorkDaysEntity.setMonthNum(month);
pzWorkDaysEntity.setWorkDay(i+"");
switch ((i+day-1)%7){
case 0 :
pzWorkDaysEntity.setWeekDay('0');
break;
case 1:
pzWorkDaysEntity.setWeekDay('1');
break;
case 2:
pzWorkDaysEntity.setWeekDay('2');
break;
case 3:
pzWorkDaysEntity.setWeekDay('3');
break;
case 4:
pzWorkDaysEntity.setWeekDay('4');
break;
case 5:
pzWorkDaysEntity.setWeekDay('5');
break;
case 6:
pzWorkDaysEntity.setWeekDay('6');
break;
}
//获取一个Calendar对象
Calendar calendar3 = Calendar.getInstance();
String today = year + "-" + month + "-" + i;
//设置星期一为一周开始的第一天
calendar3.setFirstDayOfWeek(Calendar.MONDAY);
calendar3.setTime(DateUtil.parseDate(today));
//获得当前日期属于今年的第几周
int weekOfYear = calendar3.get(Calendar.WEEK_OF_YEAR);
ChineseDate date = new ChineseDate(DateUtil.parseDate(today));
String cyclicalYMD = date.getCyclicalYMD();
char[] chars = cyclicalYMD.toCharArray();
pzWorkDaysEntity.setZodiac(date.getChineseZodiac());
pzWorkDaysEntity.setSixtyYear(date.getCyclical());
pzWorkDaysEntity.setChineseDay(date.getChineseMonth()+""+date.getChineseDay());
pzWorkDaysEntity.setWeekNum(weekOfYear);
pzWorkDaysEntity.setFestivalName(date.getFestivals());
pzWorkDaysEntity.setSixtyMonth(chars[3]+""+chars[4]);
pzWorkDaysEntity.setSixtyDay(chars[6]+""+chars[7]);
//判断当天是否为节假日
List<HolidayVo> collect = holidays.stream().filter(l -> l.getStartday().equals(today)).collect(Collectors.toList());
//默认双休和法定节假日为休息日,其他均为工作日
if (!collect.isEmpty()){
//此处由于hutool请求到的节假日为农历,元旦等节日无法请求到。
pzWorkDaysEntity.setFestivalName(collect.get(0).getName());
pzWorkDaysEntity.setIsWeekday('否');
pzWorkDaysEntity.setHolidayType("1");
}else {
if (pzWorkDaysEntity.getWeekDay() == '6' || pzWorkDaysEntity.getWeekDay() == '0'){
pzWorkDaysEntity.setIsWeekday('否');
pzWorkDaysEntity.setHolidayType("0");
}else {
pzWorkDaysEntity.setIsWeekday('是');
}
}
pzWorkDaysEntity.setOperateUser(user.getRealName());
pzWorkDaysEntity.setOperateTime(new Date());
list.add(pzWorkDaysEntity);
}
}
return list;
}
/**
* 获得两个日期间天数差
* @param day1 日期1 用户查询日期
* @param day2 日期2 1900/1/1
* @return 天数差
*/
public static int getDaysBetween(Calendar day1,Calendar day2){
//得到当前时间在一年中的天数
int days = day1.get(Calendar.DAY_OF_YEAR);
//获取年
int y1 = day1.get(Calendar.YEAR);
//计算1900/1/1日 与 y1/1/1日的天数差
if(day2.get(Calendar.YEAR) != y1){
day2 = (Calendar)day2.clone();
do{
days += day2.getActualMaximum(Calendar.DAY_OF_YEAR);
day2.add(Calendar.YEAR, 1);
}while(day2.get(Calendar.YEAR) != y1);
}
return days;
}
/**
* https://docs.topthink.com/think-api
* @param year 年份
* @return
*/
public List<HolidayVo> getHolidays(int year){
//appcode在以下网址申请
String appCode = "";
String url = "https://api.topthink.com/calendar/year";
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("appCode",appCode);
paramMap.put("year",year);
String result = HttpUtil.get(url, paramMap);
JSONObject jsonObject = JSONObject.parseObject(result);
List<HolidayVo> list = JSON.parseArray(JSONObject.parseObject(jsonObject.getString("data")).getString("holiday_list"), HolidayVo.class);
return list;
}