JAVA组装一个日历数据

package com.dawn.question.api.wechat.dao;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.MappingJsonFactory;

import java.io.StringWriter;
import java.util.*;


/**
 * Author: cg
 * Date: 2020/7/1 17:24
 * Content:
 */
public class SignDataTableModel {
    

    private static String[] parsePatterns = {"yyyy-MM-dd",
            "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd",
            "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd",
            "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
    //第几天
    private Integer day;
    //是否签到(1:已签到,0:未签到)
    private Integer isSign;
    //是否是今天(1:是,0:否)
    private Integer isToday;
    //月份
    private Integer month;
    //月份字符串(month+"月")
    private String monthStr;

    public  Date parseDate(String str) {
        if (str == null) {
            return null;
        }
        try {
            return org.apache.commons.lang.time.DateUtils.parseDate(str, parsePatterns);
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    public Integer getWeekDayNumber(String dateStr) {
        Date date = parseDate(dateStr);
        Calendar calendar = Calendar.getInstance();
        if(date != null){
            calendar.setTime(date);
        }
        int w = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        return w;
    }
    public Integer getMonthOneWeek(int dayNumber) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        String oneDay = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-"+dayNumber+"";//1号日期
        int index = getWeekDayNumber(oneDay);
        if(index==0){
            index=7;
        }
        return  index;
    }
    /**
     * 获取的当月最后一天是几号
     */
    public  Integer getMonthLastDay() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH)+1;
        String beforeMonthLastStr = year+"-"+(month+1)+"-"+"01"; //上个月日期
        cal.setTime(parseDate(beforeMonthLastStr));
        cal.set(Calendar.DAY_OF_MONTH,0);
        return cal.get(Calendar.DAY_OF_MONTH);
    }
    /**
     * 获取的当月最后一天是星期几
     */
    public  Integer getMonthLastWeekNumber() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        int lastDay = getMonthLastDay();//本月最后一天是几号
        String lastDayStr = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-"+lastDay+"";//1号日期
        int index = getWeekDayNumber(lastDayStr);
        if(index==0){
            index=7;
        }
        return  index;
    }

    /**
     * 获取的上月最后一天是几号
     */
    public Integer getBeforeMonthLastDay() {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH)+1;
        if (month==12){
            month=0;
            year=year+1;
        }
        String beforeMonthLastStr = year+"-"+(month)+"-"+"01"; //上个月日期
        cal.setTime(parseDate(beforeMonthLastStr));
        cal.set(Calendar.DAY_OF_MONTH,0);
        return cal.get(Calendar.DAY_OF_MONTH);
    }
    
    public  String toJson(Object object) {
        MappingJsonFactory f = new MappingJsonFactory();
        StringWriter sw = new StringWriter();
        try {
            JsonGenerator generator = f.createGenerator(sw);
            generator.writeObject(object);
            generator.close();
        } catch (Exception e) {
            return "";
        }
        return sw.toString();
    }

    public static void main(String[] args) {
        /*组装日历数据*/
//        headMap(year:'2019', month:'四月', days:[dataMap(rowIndex:0,data:[]) ])
        Map headMap = new HashMap();
        Calendar cal = Calendar.getInstance();
        headMap.put("year", cal.get(Calendar.YEAR));
        headMap.put("month", (cal.get(Calendar.MONTH) + 1) + "月");
        SignDataTableModel tableModel = new SignDataTableModel();
        List<SignDataTableModel> monthDataList = new ArrayList<>();

        int monthOneWeek = tableModel.getMonthOneWeek(1);//本月1号是星期几(1-7)
        int lastDay = tableModel.getMonthLastDay();//本月最后一天是几号
        int monthLastWeek = tableModel.getMonthLastWeekNumber();//本月最后一天是星期几(1-7)
        int beforeMonthLastDay = tableModel.getBeforeMonthLastDay();//上个月最后一天是几号

        int beforeDay = beforeMonthLastDay-monthOneWeek+2;
        int nextDay = 1;
        int index = 1;
        int totalCount = lastDay+monthOneWeek-1+(7-monthLastWeek);//日历表总天数
        int beforeMonth = cal.get(Calendar.MONTH);
        if(beforeMonth==0){
            beforeMonth=12;
        }
        int nextMonth = cal.get(Calendar.MONTH)+2;
        if(nextMonth==13){
            nextMonth=1;
        }
        for (int i=0;i<totalCount;i++){
            tableModel = new SignDataTableModel();
            tableModel.setIsToday(0);
            tableModel.setIsSign(0);
            if(beforeDay<=beforeMonthLastDay){
                tableModel.setDay(beforeDay);
                tableModel.setMonth(beforeMonth);
                tableModel.setMonthStr(beforeMonth+"月");
                beforeDay++;
            }else {
                tableModel.setDay(index);
                if (index==cal.get(Calendar.DATE)){
                    tableModel.setIsToday(1);
                }
                tableModel.setMonth(cal.get(Calendar.MONTH)+1);
                tableModel.setMonthStr((cal.get(Calendar.MONTH)+1)+"月");
                index++;
            }
            if(index-1>lastDay && 7-monthLastWeek>0){
                tableModel.setDay(nextDay);
                tableModel.setMonth(nextMonth);
                tableModel.setMonthStr(nextMonth+"月");
                nextDay++;
            }
            monthDataList.add(tableModel);
        }
        //日历表的签到数据
        int toDay = monthDataList.get(0).getDay();
        int endDay = monthDataList.get(monthDataList.size()-1).getDay();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH)+1;
        String beforeMonthStr=beforeMonth+"";
        String nextMonthStr=nextMonth+"";
        if(beforeMonth<10){
            beforeMonthStr="0"+beforeMonthStr;
        }
        if(nextMonth<10){
            nextMonthStr="0"+nextMonthStr;
        }
        String monthStr = month+"";
        if(month<10){
            monthStr="0"+monthStr;
        }
        String statTime = year+"-"+monthStr+"-"+toDay;
        String endTime = year+"-"+monthStr+"-"+endDay;
        if(toDay>1){
            statTime=year+"-"+beforeMonthStr+"-"+toDay;
            if(beforeMonth==12){
                statTime=(year-1)+"-"+beforeMonthStr+"-"+toDay;
            }
        }
        if(endDay<=7){
            endTime=year+"-"+nextMonthStr+"-0"+endDay;
            if(nextMonth==1){
                endTime=(year+1)+"-"+nextMonthStr+"-0"+endDay;
            }
        }

        List<SignDataTableModel> rowDataList = new ArrayList<>();
        Map rowMap;
        List<Map> rowMaps = new ArrayList();
        int i=0;
        int rowNumber=0;
        for (SignDataTableModel signDataTableModel : monthDataList) {
            i++;
            rowDataList.add(signDataTableModel);
            if(i%7==0){
                rowNumber++;
                rowMap = new LinkedHashMap();
                rowMap.put("rowIndex",rowNumber);
                rowMap.put("data",rowDataList);
                rowMaps.add(rowMap);
                rowDataList = new ArrayList<>();
            }
        }
        headMap.put("days",rowMaps);
        System.out.println(tableModel.toJson(headMap));
    }

    public Integer getDay() {
        return day;
    }

    public void setDay(Integer day) {
        this.day = day;
    }

    public Integer getIsSign() {
        return isSign;
    }

    public void setIsSign(Integer isSign) {
        this.isSign = isSign;
    }

    public Integer getIsToday() {
        return isToday;
    }

    public void setIsToday(Integer isToday) {
        this.isToday = isToday;
    }

    public Integer getMonth() {
        return month;
    }

    public void setMonth(Integer month) {
        this.month = month;
    }

    public String getMonthStr() {
        return monthStr;
    }

    public void setMonthStr(String monthStr) {
        this.monthStr = monthStr;
    }
    
}

 

posted @ 2020-06-12 16:43  无言灬亦知心  阅读(277)  评论(0编辑  收藏  举报