项目中日历管理学习使用

一些项目中会有日历或日期设置,最基本的会显示工作日,休息日,节假日等等,下面就是基于项目中的日历管理功能,要显示工作日,休息日,节假日

效果图

在这里插入图片描述

获取国家法定节假日工具类

public class HolidayUtils {

    private static Logger logger = LoggerFactory.getLogger(HolidayUtils.class);

    public static Map<String,Map<String,OtherData>> monthToHolidayDate = new ConcurrentHashMap<>(12);
    public static Map<String,OtherData> dateToOtherData = new ConcurrentHashMap<>(12);

    public static void main(String[] args) {
        System.out.println(getAllHoliday(2024));
    }

    /**
     * 获取周末和节假日
     *
     * @param year
     * @return
     */
    public static List<String> getAllHoliday(int year) {

        // 获取所有的周末
        Set<String> allWeekend = getAllWeekend(year);
        // http://timor.tech/api/holiday api文档地址
        Map apiHoliday = getApiHoliday(year);
        Integer code = (Integer) apiHoliday.get("code");
        if (code != 0) {
            return null;
        }
        Map<String, Map<String, Object>> holiday = (Map<String, Map<String, Object>>) apiHoliday.get("holiday");
        Set<String> strings = holiday.keySet();
        for (String str : strings) {
            Map<String, Object> stringObjectMap = holiday.get(str);
            Integer wage = (Integer) stringObjectMap.get("wage");
            String date = (String) stringObjectMap.get("date");
            //筛选掉补班
            if (wage.equals(1)) {
                allWeekend.remove(date);
            } else {
                allWeekend.add(date);
            }
            int monthByDate = CalendarUtils.getMonthByDate(CalendarUtils.parseDateStrToDate(date, "yyyy-MM-dd"));
            if (!monthToHolidayDate.containsKey(monthByDate)){
                monthToHolidayDate.put(monthByDate+"",new HashMap<>());
            }
            Map<String, OtherData> dateToOtherData = monthToHolidayDate.get(monthByDate);
            if (dateToOtherData == null) dateToOtherData = new HashMap<>();
            if (!dateToOtherData.containsKey(date)){
                OtherData otherData = new OtherData();
                otherData.putAll(stringObjectMap);
                dateToOtherData.put(date,otherData);
                dateToOtherData.put(date,otherData);
            }
        }

        List<String> result = new ArrayList<>(allWeekend);
        result = result.stream().sorted().collect(Collectors.toList());
        return result;
    }

    /**
     * 获取节假日不含周末
     *
     * @param year
     * @return
     */
    private static Map getApiHoliday(int year) {
        String url = "http://timor.tech/api/holiday/year/" + year;
        String rsa = HttpUtil.get(url);
        logger.info("rsa:{}",rsa);
        Map map = JsonConverter.jsonStrToObject(rsa, Map.class);
        return map;
    }

    /**
     * 获取周末  月从0开始
     *
     * @param year
     * @return
     */
    public static Set<String> getAllWeekend(int year) {
        Set<String> dateList = new HashSet<>();
        SimpleDateFormat simdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = new GregorianCalendar(year, 0, 1);
        Calendar endCalendar = new GregorianCalendar(year, 11, 31);
        while (true) {
            int weekday = calendar.get(Calendar.DAY_OF_WEEK);
            if (weekday == 1 || weekday == 7) {
                dateList.add(simdf.format(calendar.getTime()));
            }
            calendar.add(Calendar.DATE, 1);
            if (calendar.getTimeInMillis() >= endCalendar.getTimeInMillis()) {
                break;
            }
        }
        return dateList;
    }

    public static Map<String,OtherData> getHolidayByMonth(String month,Date date){
        if (monthToHolidayDate == null) return new HashMap<>();
        if (StringUtils.isNotBlank(month)){
            month = CalendarUtils.getMonthByDate(date) + "";
            Map<String, OtherData> dateToOtherData = monthToHolidayDate.get(month);
            if (dateToOtherData == null) dateToOtherData = new HashMap<>();
            return dateToOtherData;
        }
        return new HashMap<>();
    }

    public static OtherData getHolidayByDate(Date date){
        String month = CalendarUtils.getMonthByDate(date) + "";
        Map<String, OtherData> dateToOtherData = monthToHolidayDate.get(month);
        if (dateToOtherData == null || dateToOtherData.size() == 0) return null;
        String dateStr = CalendarUtils.toString(date, "yyyy-MM-dd");
        OtherData otherData = dateToOtherData.get(dateStr);
        if (otherData != null && otherData.obtainVal("wage",Integer.class) != null
                && 1 == otherData.obtainVal("wage",Integer.class)){
            return null;
        }
        return otherData;
    }

    public static String isHoliday(Date date){
        String month = CalendarUtils.getMonthByDate(date) + "";
        Map<String, OtherData> dateToOtherData = monthToHolidayDate.get(month);
        if (dateToOtherData == null || dateToOtherData.size() == 0) return null;
        String dateStr = CalendarUtils.toString(date, "yyyy-MM-dd");
        OtherData otherData = dateToOtherData.get(dateStr);
        if (otherData == null) return null;
        if (otherData != null && otherData.obtainVal("wage",Integer.class) != null
                && 1 == otherData.obtainVal("wage",Integer.class)){
            return DateRec.DATE_TYPE_WORK;
        }
        return DateRec.DATE_TYPE_HOLIDAY;
    }

}

返回的JSON数据格式

{
	"code": 0,
	"holiday": {
		"01-01": {
			"holiday": true,
			"name": "元旦",
			"wage": 3,
			"date": "2024-01-01",
			"rest": 1
		},
		"02-04": {
			"holiday": false,
			"name": "春节前补班",
			"wage": 1,
			"after": false,
			"target": "春节",
			"date": "2024-02-04",
			"rest": 9
		},
		"02-10": {
			"holiday": true,
			"name": "初一",
			"wage": 3,
			"date": "2024-02-10",
			"rest": 15
		},
		"02-11": {
			"holiday": true,
			"name": "初二",
			"wage": 3,
			"date": "2024-02-11",
			"rest": 1
		},
		"02-12": {
			"holiday": true,
			"name": "初三",
			"wage": 3,
			"date": "2024-02-12"
		},
		"02-13": {
			"holiday": true,
			"name": "初四",
			"wage": 2,
			"date": "2024-02-13"
		},
		"02-14": {
			"holiday": true,
			"name": "初五",
			"wage": 2,
			"date": "2024-02-14"
		},
		"02-15": {
			"holiday": true,
			"name": "初六",
			"wage": 2,
			"date": "2024-02-15"
		},
		"02-16": {
			"holiday": true,
			"name": "初七",
			"wage": 2,
			"date": "2024-02-16"
		},
		"02-17": {
			"holiday": true,
			"name": "初八",
			"wage": 2,
			"date": "2024-02-17"
		},
		"02-18": {
			"holiday": false,
			"name": "春节后补班",
			"wage": 1,
			"after": true,
			"target": "春节",
			"date": "2024-02-18"
		},
		"04-04": {
			"holiday": true,
			"name": "清明节",
			"wage": 3,
			"date": "2024-04-04",
			"rest": 46
		},
		"04-05": {
			"holiday": true,
			"name": "清明节",
			"wage": 2,
			"date": "2024-04-05"
		},
		"04-06": {
			"holiday": true,
			"name": "清明节",
			"wage": 2,
			"date": "2024-04-06"
		},
		"04-07": {
			"holiday": false,
			"name": "清明节后补班",
			"wage": 1,
			"target": "清明节",
			"after": true,
			"date": "2024-04-07"
		},
		"04-28": {
			"holiday": false,
			"name": "劳动节前补班",
			"wage": 1,
			"target": "劳动节",
			"after": false,
			"date": "2024-04-28"
		},
		"05-01": {
			"holiday": true,
			"name": "劳动节",
			"wage": 3,
			"date": "2024-05-01"
		},
		"05-02": {
			"holiday": true,
			"name": "劳动节",
			"wage": 2,
			"date": "2024-05-02",
			"rest": 1
		},
		"05-03": {
			"holiday": true,
			"name": "劳动节",
			"wage": 3,
			"date": "2024-05-03"
		},
		"05-04": {
			"holiday": true,
			"name": "劳动节",
			"wage": 3,
			"date": "2024-05-04"
		},
		"05-05": {
			"holiday": true,
			"name": "劳动节",
			"wage": 3,
			"date": "2024-05-05"
		},
		"05-11": {
			"holiday": false,
			"name": "劳动节后补班",
			"after": true,
			"wage": 1,
			"target": "劳动节",
			"date": "2024-05-11"
		},
		"06-08": {
			"holiday": true,
			"name": "端午节",
			"wage": 2,
			"date": "2024-06-08"
		},
		"06-09": {
			"holiday": true,
			"name": "端午节",
			"wage": 2,
			"date": "2024-06-09"
		},
		"06-10": {
			"holiday": true,
			"name": "端午节",
			"wage": 3,
			"date": "2024-06-10"
		},
		"09-14": {
			"holiday": false,
			"name": "中秋节前补班",
			"after": false,
			"wage": 1,
			"target": "中秋节",
			"date": "2024-09-14",
			"rest": 96
		},
		"09-15": {
			"holiday": true,
			"name": "中秋节",
			"wage": 2,
			"date": "2024-09-15",
			"rest": 97
		},
		"09-16": {
			"holiday": true,
			"name": "中秋节",
			"wage": 2,
			"date": "2024-09-16"
		},
		"09-17": {
			"holiday": true,
			"name": "中秋节",
			"wage": 3,
			"date": "2024-09-17"
		},
		"09-29": {
			"holiday": false,
			"name": "国庆节前补班",
			"after": false,
			"wage": 1,
			"target": "国庆节",
			"date": "2024-09-29"
		},
		"10-01": {
			"holiday": true,
			"name": "国庆节",
			"wage": 3,
			"date": "2024-10-01"
		},
		"10-02": {
			"holiday": true,
			"name": "国庆节",
			"wage": 3,
			"date": "2024-10-02",
			"rest": 1
		},
		"10-03": {
			"holiday": true,
			"name": "国庆节",
			"wage": 3,
			"date": "2024-10-03"
		},
		"10-04": {
			"holiday": true,
			"name": "国庆节",
			"wage": 2,
			"date": "2024-10-04"
		},
		"10-05": {
			"holiday": true,
			"name": "国庆节",
			"wage": 2,
			"date": "2024-10-05"
		},
		"10-06": {
			"holiday": true,
			"name": "国庆节",
			"wage": 2,
			"date": "2024-10-06",
			"rest": 1
		},
		"10-07": {
			"holiday": true,
			"name": "国庆节",
			"wage": 2,
			"date": "2024-10-07",
			"rest": 1
		},
		"10-12": {
			"holiday": false,
			"after": true,
			"wage": 1,
			"name": "国庆节后补班",
			"target": "国庆节",
			"date": "2024-10-12"
		}
	}
}

实体模型

@Entity
@Table(
    name = "t_daterec",
    indexes={
        @Index(name="idx_t_daterec1",columnList="dateType"),
        @Index(name="idx_t_daterec2",columnList="dateTime")
    }
)
public class DateRec extends ExBizEntity {

    public static final String DATE_TYPE_WORK = "work";
    public static final String DATE_TYPE_WEEKEND = "weekend";
    public static final String DATE_TYPE_HOLIDAY = "holiday";

    @Column(length=20,nullable=false)
    private String dateType;//日历类型
    private Date dateTime;//日期

    public String getDateType() {
        return dateType;
    }

    public Date getDateTime() {
        return dateTime;
    }

    public DateRec() {
    }

    public DateRec(String id,String dateType, Date dateRTime) {
    	this.id = id;
        this.dateType = dateType;
        this.dateTime = dateTime;
    }
}
@Entity
@Table(
        name = "t_holiday",
        indexes={
                @Index(name="idx_t_holiday1",columnList="holidayDate")
        }
)
public class Holiday extends ExBizEntity{

    private Date holidayDate;

    public Holiday() {
    }

    public Holiday(Date holidayDate) {
        this.holidayDate = holidayDate;
    }

    public Date getHolidayDate() {
        return holidayDate;
    }
}

超类

@MappedSuperclass
public abstract class ExBizEntity extends ValueObjectEntity {
    
    @Type(type="com.xysd.common.utils.hibernateType.MyCustomJsonType")
    private OtherData exAttr = new OtherData();//额外属性map
    
    public OtherData getExAttr() {
        return exAttr;
    }
    
    
    protected ExBizEntity(){
        super();
    }
    protected ExBizEntity(Map<String, Object> exAttr) {
        super();
        this.getNotNullExAttrWithUpdate().putAll(exAttr);
    }
    
    
    //获取非空扩展属性
    private OtherData getNotNullExAttrWithUpdate() {
        if(this.exAttr == null) this.exAttr = new OtherData();
        return this.exAttr;
    }
    public void clearExAttr(){
        this.exAttr = null;
    }
    //更新扩展属性
    public void updateExAttr(Map<String, Object> exAttr){
        this.getNotNullExAttrWithUpdate().clear();
        if(exAttr==null) {
            this.exAttr = null;
            return;
        }
        this.addAttrs(exAttr);
    }
    //添加扩展属性
    public void addAttr(String key, Object value){
        if(StringUtils.isBlank(key)) return;
        if(value==null) {
            this.getNotNullExAttrWithUpdate().remove(key);
        }else {
            this.getNotNullExAttrWithUpdate().put(key, value);
        }
    }
    //添加扩展属性
    public void addAttrs(Map<String, Object> exAttr){
        if(exAttr==null) return;
        for (Map.Entry<String,Object> e : exAttr.entrySet()) {
            this.addAttr(e.getKey(), e.getValue());
        }
    }
    
    //获取指定类型的对象
    @Transient
    public <T> T getAttr(String key) {
        if(this.exAttr==null) return null;
        return this.exAttr.obtainVal(key);
    }
    //获取指定类型的对象
    @Transient
    public <T> T getAttr(String key, Class<T> valClass) {
        if(this.exAttr==null) return null;
      return this.exAttr.obtainVal(key, valClass);
    }
    //获取指定转换类型的对象
    @Transient
    public <T> T getAttr(String key, TypeReference<T> valTypeRef) {
        if(this.exAttr==null) return null;
        return this.exAttr.obtainVal(key, valTypeRef);
    }
    
}
@MappedSuperclass
public abstract class ValueObjectEntity extends IEntity{
    public static String SYSCODE_CAD="cad";//系统编码-cad:cad接口

    protected Date createTime = new Date();//创建时间
    @Type(type = "org.hibernate.type.NumericBooleanType")
    protected boolean history=false;
    @Column(length=40)
    protected String createIp;//创建时的ip
    protected int valid=1;//有效性
    protected Date lastUpdateDate = new Date();//最后更新时间
    
    @Column(length=10)
    protected String syscode=SYSCODE_HDXF; //数据系统编码
    
    
    public Date getCreateTime() {
        return createTime;
    }
    public boolean isHistory() {
        return history;
    }
    public String getCreateIp() {
        return createIp;
    }
    public int getValid() {
        return valid;
    }
    public Date getLastUpdateDate() {
        return lastUpdateDate;
    }
    public String getSyscode() {
        return syscode;
    }
    
    
    protected ValueObjectEntity() {
        super();
    }
    

    @Transient
    public boolean isValidEntity(){
        return this.getValid()==1;
    }
    public void updateValid(int valid){
        this.valid = valid;
    }

}
@MappedSuperclass
public abstract class IEntity {

    @Id
    @Column(length=100)
    @GeneratedValue(generator="uuidkey")
    @GenericGenerator(name="uuidkey", strategy = "com.xysd.common.utils.BaseIDGenerator")
    protected String id;

	public String getId() {
		return this.id;
	}
	
    /**
     * 对比俩个实体是否是同一个
     */
	public boolean compareObject(IEntity other) {
        return other != null && new EqualsBuilder().
            append(this.id, other.getId()).
            isEquals();
	}
	
}

public class BaseIDGenerator implements IdentifierGenerator {

    private static AutoIncrementIdUtil autoIncrementIdUtil;

    public static void registAutoIncrementIdUtil(AutoIncrementIdUtil autoIncrementIdUtil){
        BaseIDGenerator.autoIncrementIdUtil = autoIncrementIdUtil;
    }

	@Override
    public Serializable generate(SharedSessionContractImplementor arg0,
            Object o) throws HibernateException {
        if(o instanceof NeedAutoIncrementId){
            NeedAutoIncrementId entity = (NeedAutoIncrementId) o;
            String id = entity.obtainId();
            if(!StringUtils.isEmpty(id)){
                entity.initId(id);
            }else {
                id = autoIncrementIdUtil.getId(entity.getClass().getSimpleName(), entity.obtainParentId(),
                        entity.obtainLength(), entity.obtainSeparator());
                entity.initId(id);
            }
            return id;
        }
        if(o instanceof IEntity){
            //允许自己指定ID
        	IEntity be = (IEntity)o;
            if(StringUtils.isNotBlank(be.getId())){
                return be.getId();
            }
        }
        return Utils.getUUID("");
    }
}

接口

@ApiOperation(value="日历管理查看",httpMethod="GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name="year",value="年份",required=true),
            @ApiImplicitParam(name="month",value="月份",required=true)
    })
    @RequestMapping(value = "/dates/list", method = RequestMethod.GET)
    public String getDates(@RequestParam int year, @RequestParam int month, HttpServletRequest hreq) {
        String weeks = myService.getDates(year,month);
        return weeks;
    }

}

Service服务及封装数据

@Service
public class MyService {

    @Autowired
    private DateRecRepositoryHibernate dateRecRepositoryHibernate;

	@PostConstruct
    public void init(){
        //加载国家法定节假日
        HolidayUtils.getAllHoliday(CalendarUtils.getCurrentYear());
        Map<String, OtherData> dateToOtherData = HolidayUtils.dateToOtherData;
        List<Holiday> holidays = this.dateRecRepositoryHibernate.getHolidays();
        if (CollectionUtils.isNotEmpty(holidays)) {
            for (Holiday holiday : holidays) {
                HolidayUtils.dateToOtherData.put(CalendarUtils.toString(holiday.getHolidayDate(), "yyyy-MM-dd"), holiday.getExAttr());
            }
        } else {
            for (Map.Entry<String, OtherData> entry : dateToOtherData.entrySet()) {
                Holiday h = new Holiday(CalendarUtils.parseDateStrToDate(entry.getKey(), "yyyy-MM-dd"));
                h.addAttrs(entry.getValue());
                this.dateRecRepositoryHibernate.createOrUpdateHoliday(h);
            }
        }
    }

    public String getDates(int year, int month) {
        //要返回前端展示使用
        List<WeekDTO> weeks = new ArrayList<WeekDTO>();
        //获取year年month月的第一天
        Date monthBegin = CalendarUtils.getMonthBeginByYearAndMonth(year, month);
        //获取year年month月的最后一天
        Date monthEnd = CalendarUtils.getMonthEndByYearAndMonth(year, month);
        WeekValObj wo = CalendarUtils.getWeekValObjByDateOfYear(monthBegin);
        //获取year年month月的第一天是这一年中第几周
        int weekNumOfMonthBegin = wo.getWeek();
        //selectYear就是year
        int selectedYear = wo.getYear();
        Map<String, DateDTO> allDates = new HashMap<String, DateDTO>();
        List<String> dates = new ArrayList<String>();
        int weekNum = 7;
        for (int k = 0; k < weekNum; k++) {
            //获取selectyear年总共有几周
            int maxWeekOfYear = CalendarUtils.getMaxWeekCountByYear(selectedYear);
            //获取selectedYear年第weekNumOfMonthBegin周的第一天日期
            Date weekBegin = CalendarUtils.getWeekBeginByYearAndWeek(selectedYear, weekNumOfMonthBegin);
            List<DateDTO> weekDates = new ArrayList<DateDTO>();
            if (weekBegin == null) {//如果没有获取到 则默认为year+1年的第一周的第一天日期
                weekBegin = CalendarUtils.getWeekBeginByYearAndWeek(year + 1, 1);
            }
            if (weekBegin != null && weekBegin.getTime() < monthEnd.getTime()) {
                for (int i = 0; i < 7; i++) {
                    //开始取第weekNumOfMonthBegin周的第i天
                    Date d = DateUtils.addDays(weekBegin, i);
                    String type = null;
                    if (StringUtils.isNotBlank(HolidayUtils.isHoliday(d))) {
                        type = HolidayUtils.isHoliday(d);
                    } else {
                        type = DateRec.DATE_TYPE_WORK;
                        if (i >= 5) {
                            type = DateRec.DATE_TYPE_WEEKEND;
                        }
                    }
                    //是否要展示
                    boolean display = d.getTime() >= monthBegin.getTime() && d.getTime() <= monthEnd.getTime();
                    String dateStr = CalendarUtils.toString(d, "yyyy-MM-dd");
                    DateDTO dateDTO = new DateDTO(dateStr, type, display);
                    weekDates.add(dateDTO);
                    allDates.put(dateDTO.getDate(), dateDTO);
                }
                weeks.add(new WeekDTO(year, weekNumOfMonthBegin, weekDates));
            }
            if (weekNumOfMonthBegin >= maxWeekOfYear) {
                selectedYear++;
                weekNumOfMonthBegin = 1;
            } else {
                weekNumOfMonthBegin++;
            }
        }
        dates.addAll(allDates.keySet());
        Map<String, Object> params = new HashMap<>();
        params.put("dates", dates);
        List<DateRec> existedDateRecs = this.dateRecRepositoryHibernate.getDateRecBy(params);
        for (DateRec drec : existedDateRecs) {
            //已存在的
            DateDTO dto = allDates.remove(drec.getId());
            if (dto != null) {
                dto.setDateType(drec.getDateType());
            }
        }
        for (DateDTO dto : allDates.values()) {
            //需要创建的
            DateRec drec = new DateRec(dto.getDate(),dto.getDateType(), CalendarUtils.parseDateStrToDate(dto.getDate(), "yyyy-MM-dd"));
            this.dateRecRepositoryHibernate.createOrUpdateDateRec(drec);
        }
        return JsonConverter.toJsonStr(weeks);
    }

}

数据基础层

@Repository
public class DateRecRepositoryHibernate extends JpaHibernateRepository {

    public void createOrUpdateDateRec(DateRec dateRec){
        this.getSession().saveOrUpdate(dateRec);
    }

    public List<DateRec> getDateRecBy(Map<String,Object> params){
        StringBuffer sql = new StringBuffer();
        sql.append(" select id from t_daterec where valid = 1 ");
        if (params.get("ids") != null){
            sql.append(" and id in (:ids) ");
        }
        if (params.get("dates") != null){
            sql.append(" and date in (:dates) ");
        }
        if (params.get("dateTypes") != null){
            sql.append(" and date_type in (:dateTypes) ");
        }
        List<String> ids = this.createSQLQueryByMapParams(sql.toString(), params).list();
        if (CollectionUtils.isEmpty(ids)) return new ArrayList<>();
        List<DateRec> recs = this.findByOrderedIds(DateRec.class, ids);
        if (recs == null) return new ArrayList<>();
        return recs;
    }

    public void createOrUpdateHoliday(Holiday holiday){
        this.getSession().saveOrUpdate(holiday);
    }

    public List<Holiday> getHolidays(){
        String sql = "select d from " + Holiday.class.getName() + " d where d.holidayDate >= : begin and d.holidayDate <= :end ";
        List<Holiday> list = this.createHQLQueryByMapParams(Holiday.class, sql, Utils.buildMap("begin", CalendarUtils.getCurrentYearBeginDate(), "end", CalendarUtils.getCurrentYearEndDate())).list();
        if (list == null) list = new ArrayList<>();
        return list;
    }
}

请求返回值

[
	{
		"year": 2024,
		"weekNum": 5,
		"dates": [
			{
				"date": "2024-01-29",
				"dateType": "work",
				"display": false
			},
			{
				"date": "2024-01-30",
				"dateType": "work",
				"display": false
			},
			{
				"date": "2024-01-31",
				"dateType": "work",
				"display": false
			},
			{
				"date": "2024-02-01",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-02",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-03",
				"dateType": "weekend",
				"display": true
			},
			{
				"date": "2024-02-04",
				"dateType": "weekend",
				"display": true
			}
		]
	},
	{
		"year": 2024,
		"weekNum": 6,
		"dates": [
			{
				"date": "2024-02-05",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-06",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-07",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-08",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-09",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-10",
				"dateType": "weekend",
				"display": true
			},
			{
				"date": "2024-02-11",
				"dateType": "weekend",
				"display": true
			}
		]
	},
	{
		"year": 2024,
		"weekNum": 7,
		"dates": [
			{
				"date": "2024-02-12",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-13",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-14",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-15",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-16",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-17",
				"dateType": "weekend",
				"display": true
			},
			{
				"date": "2024-02-18",
				"dateType": "weekend",
				"display": true
			}
		]
	},
	{
		"year": 2024,
		"weekNum": 8,
		"dates": [
			{
				"date": "2024-02-19",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-20",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-21",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-22",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-23",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-24",
				"dateType": "weekend",
				"display": true
			},
			{
				"date": "2024-02-25",
				"dateType": "weekend",
				"display": true
			}
		]
	},
	{
		"year": 2024,
		"weekNum": 9,
		"dates": [
			{
				"date": "2024-02-26",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-27",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-28",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-02-29",
				"dateType": "work",
				"display": true
			},
			{
				"date": "2024-03-01",
				"dateType": "work",
				"display": false
			},
			{
				"date": "2024-03-02",
				"dateType": "weekend",
				"display": false
			},
			{
				"date": "2024-03-03",
				"dateType": "weekend",
				"display": false
			}
		]
	}
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/351064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240126请问在ubuntu20.04.6下让GTX1080显卡让whisper工作在large模式下?

20240126请问在ubuntu20.04.6下让GTX1080显卡让whisper工作在large模式下&#xff1f; 2024/1/26 21:19 问GTX1080模式使用large该如何配置呢&#xff1f; 这个问题没有完成&#xff0c;可能需要使用使用显存更大的显卡了&#xff01; 比如GTX1080Ti 11GB&#xff0c;更猛的可…

05-TiDB 之 HTAP 快速上手

混合型在线事务与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 功能 HTAP 存储引擎&#xff1a;行存 与列存 同时存在&#xff0c;自动同步&#xff0c;保持强一致性。行存 OLTP &#xff0c;列存 OLAPHTAP 数据一致性&#xff1a;作为一个分布式事务…

mac/macos上编译electron源码

官方教程&#xff1a;Build Instructions | Electron 准备工作这里不写了&#xff0c;参考官方文档&#xff0c;还有上一篇windows编译electron electron源码下载及编译-CSDN博客 差不多步骤&#xff0c;直接来 网络记得使用魔法 下载编译步骤 0. 选择目录很重要&#xff0…

02 Redis之配置文件

3. Redis配置文件 3.1 网络部分 首先明确&#xff0c;tcp-backlogestablished Linux 内核 2.2 版本之后&#xff08;现在大部分都是3.x了&#xff09; TCP 系统中维护了两个队列, 用来存放TCP连接 a. SYN_RECEIVED 队列中存放未完成三次握手的连接 b. ESTABLISHED队列中存放已…

算力、应用、方案,联想布局全栈AI,以自身制造与供应链范本助力千行百业智能化转型升级

1月23日-24日&#xff0c;联想集团举办主题为“算领AI时代 筑基智能变革”的擎智媒体沙龙和新IT思享会“走进联想”活动。在活动中&#xff0c;联想集团副总裁、中国区首席市场官王传东表示&#xff0c;今年是联想成立40周年&#xff0c;联想已构建了全栈智能布局&#xff0c;将…

派网AX50C做多宽带路由和核心交换机配置实战教程

接近300办公人员的工厂需要网络升级&#xff0c;我规划设计和部署实施了以下方案&#xff0c;同样是简约不简单&#xff0c;在满足性能需求稳定性的前提下&#xff0c;既有经济性&#xff0c;又有安全性。 派网做路由器&#xff0c;刚好开启默认防病毒策略&#xff0c;省下来一…

携程开源 基于真实请求与数据的流量回放测试平台、自动化接口测试平台AREX

携程开源 基于真实请求与数据的流量回放测试平台、自动化接口测试平台AREX 官网文档 基于真实请求与数据的流量回放测试平台、自动化接口测试平台AREX 这篇文章稍稍水一下&#xff0c;主要讲下部署过程里踩的坑&#xff0c;因为部署的过程主要是运维同学去处理了&#xff0c;我…

力扣每日一题 ---- 1039. 多边形三角剖分的最低得分

这题的难点在哪部分呢&#xff0c;其实是怎么思考。这道题如果之前没做过类似的话&#xff0c;还是很难看出一些性质的&#xff0c;这题原本的话是没有图片把用例显示的这么详细的。这题中有个很隐晦的点没有说出来 剖出来的三角形是否有交叉&#xff0c;这题中如果加一个三角…

【HarmonyOS应用开发】TypeScript快速入门(二)

内容比较长&#xff0c;干货满满&#xff0c;全是实战操作内容&#xff0c;希望耐心观看&#xff0c;如果对你有所帮助&#xff0c;请点个赞&#xff01; ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI…

力扣hot100 课程表 拓扑序列

Problem: 207. 课程表 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 三叶题解 复杂度 时间复杂度: O ( n m ) O(nm) O(nm) 空间复杂度: O ( n m ) O(nm) O(nm) Code class Solution{int N 100010, M 5010, idx;int[] in new int[N];// in[i] 表示节…

第六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:摄像头标定

传奇开心果博文系列 系列博文目录Python的OpenCV库技术点案例示例系列 博文目录一、前言二、OpenCV摄像头标定介绍三、摄像头内外参数标定示例代码和扩展四、立体视觉标定示例代码和扩展五、归纳总结 系列博文目录 Python的OpenCV库技术点案例示例系列 博文目录 一、前言 O…

一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率二、使用步骤1、研究背景2、方法提出3、相关方法3.1、FSR网络结构3.2…

【微信小程序】常用的几种轮播图

轮播效果一 wxml: <view classpageBox pageOne><view classlist><swiper indicator-dots"{{true}}" autoplay"{{false}}" previous-margin"{{140rpx}}" next-margin"{{140rpx}}" bindchange"swiperChange"&…

AI编译器的后端优化策略

背景 工作领域是AI芯片工具链相关&#xff0c;很多相关知识的概念都是跟着项目成长建立起来&#xff0c;但是比较整个技术体系在脑海中都不太系统&#xff0c;比如项目参与中涉及到了很多AI编译器开发相关内容&#xff0c;东西比较零碎&#xff0c;工作中也没有太多时间去做复盘…

算子:详细篇

目录 一、执行环境 1.1 创建执行环境 1.2 执行模式 二、源算子 2.1 从集合中读取数据 2.2 从文件读取数据 2.3 从socket读取数据 2.4 从kafka读取数据 三、转换算子 3.1 基本转换算子 &#xff08;1&#xff09;映射(map) &#xff08;2&#xff09;过滤(filter) &#xff08…

网络分层和网络原理之UDP和TCP

温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本&#xff09;. http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…

云手机哪一款好用?

随着海外市场的不断发展&#xff0c;云手机市场也呈现蓬勃的态势&#xff0c;众多云设备软件纷纷涌现。企业在选择云手机软件时&#xff0c;如何找到性能卓越的软件成为一项关键任务。在众多选择中&#xff0c;OgPhone云手机凭借其卓越的性能和独特功能脱颖而出。以下是OgPhone…

音频格式之AAC:(3)AAC编解码原理详解

系列文章目录 音频格式的介绍文章系列&#xff1a; 音频编解码格式介绍(1) ADPCM&#xff1a;adpcm编解码原理及其代码实现 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#xff1a;(1)MP3封装格式简介 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#x…

一文详解C++拷贝构造函数

文章目录 引入一、什么是拷贝构造函数&#xff1f;二、什么情况下使用拷贝构造函数&#xff1f;三、使用拷贝构造函数需要注意什么&#xff1f;四、深拷贝和浅拷贝浅拷贝深拷贝 引入 在现实生活中&#xff0c;可能存在一个与你一样的自己&#xff0c;我们称其为双胞胎。 相当…

5|领域建模实践(上):怎样既准确又深刻地理解业务知识?

上节课咱们完成了事件风暴&#xff0c;梳理了系统的行为需求。但你可能也发现了&#xff0c;其实还有些微妙的业务概念还没有澄清&#xff0c;这就要靠领域建模来完成了。 建立领域模型是 DDD 的核心。要建好领域建模&#xff0c;需要理论和实践相结合。由于我们的模型有一定的…
最新文章