天天看點

java util.date和sql.date

1. 周遊時間區間

/**
     * 1. 觸發時擷取目前時間點時間;
     * 2. 擷取後3年的時間資料;(需要幹掉目前時間之後的資料)
     * 3. 解析每一天的資料:日/周/月/季度/年/财年.../假期,封裝list;
     * 4. 批量新增list
     *
     * @author: leiming5
     */
    private void handle() {

        Date startDate = new Date();

        Calendar startCalender = Calendar.getInstance();
        startCalender.setTime(startDate);
        startCalender.add(Calendar.YEAR, 3);
        Date endDate = startCalender.getTime();

        Map<String, List<Map>> map = getHolidayInInterval(startDate, endDate);

        AcParam<PssCalendar> acParam = new AcParam<>();
        List<PssCalendar> listDate = new ArrayList<>();

        try {
            startCalender.setTime(startDate);

            while (startCalender.getTime().before(endDate)) {

                PssCalendar pssCalendar = getPssCalendar(startCalender, map);

                listDate.add(pssCalendar);

                startCalender.add(Calendar.DAY_OF_MONTH, 1);
            }

            acParam.setList(listDate);

        } catch (Exception e) {
            e.printStackTrace();
        }

        calendarService.cleanFutureData();
        calendarService.batchAdd(acParam);
    }
           

2. 月曆對象

通過date ,解析出當天的其他屬性(如下)

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.util.Calendar;
import java.sql.Date;

/**
 * @description: Calendar
 * @author: leiming5
 * @date: 2021-01-29 12:33
 */
@Getter
@Setter
@TableName("dim_pss_calendar")
public class PssCalendar extends BaseModel implements Serializable {

    /**
     * 以天為次元,記錄到資料庫
     */
    private Date date;

    /**
     * 1.月曆周不拆分:WX:表示這個周都在這個月曆月裡。如:表格上的W1
     * 2.财年周要拆分:WX-Y:表示這個周跨月了,如上表的【W48-1】、【W48-2】
     * 3.周跨月:若該周的天>=3天在A月,那就算在A月,A月對應的季度和年。
     * 若該周的天<3天在A月,那就算在B月,B月對應的季度和年。
     * 如上表的【W48-1】、【W48-2】、【W52】分别對應的月曆年/季/月和财年/季/月。
     * 4.周跨月曆年:将以1月1日所在的那個周為W1。但是在後面PSS引用算量時,還是以周跨月的方式計算。
     */
    private String week;
    /**
     * 财年 周
     */
    private String fiscalWeek;
    /**
     * 自然周數
     */
    @TableField(exist = false)
    private Integer weekNumber;


    /**
     * 自然月
     */
    private String month;
    /**
     * 财年 月
     */
    private String fiscalMonth;
    /**
     * 月數
     */
    @TableField(exist = false)
    private Integer monthNumber;

    /**
     * 自然季度
     */
    private String quarter;
    /**
     * 财年 季度
     */
    private String fiscalQuarter;
    /**
     * 自然季度數
     */
    @TableField(exist = false)
    private Integer quarterNumber;

    /**
     * 自然年
     */
    private Integer year;
    /**
     * 财年 年
     */
    private String fiscalYear;


    /**
     * 本周工廠假期資訊  plant作為key, 關聯dim_holiday取holiday作為value
     */
    private JSONObject holidayPlants;

    private String weekStart;
    private String weekEnd;
    private String fiscalWeekStart;
    private String fiscalWeekEnd;


    /**
     * 建立人
     */
    private String creator;

    /**
     * 修改人
     */
    private String updateBy;

    /**
     * 設定
     * 财年的差別在于:年,和季度(月不變,周:财年周要拆分,月曆周不拆分)
     * 1.擷取周、月、季度、年 的int資料
     * 2.年
     * 3.月/季度 -> 财年(月/季度/年)
     * 4.周
     *
     * @param date 目前
     */
    public void setDate(Date date) {

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        // 1. 擷取周、月、季度、年 的int資料
        this.date = date;
        // 當年第幾周
        this.weekNumber = calendar.get(Calendar.WEEK_OF_YEAR) + 2;
        this.monthNumber = calendar.get(Calendar.MONTH) + 1;
        this.quarterNumber = monthNumber % 3 == 0 ? monthNumber / 3 : monthNumber / 3 + 1;
        // 2. 年
        this.year = calendar.get(Calendar.YEAR);


        // 3. setMonthAndQuarterAndYearByMonth
        setByMonth(this.monthNumber);

        // 4. setWeekAndFiscalWeek
        setWeekAndFiscalWeek(calendar);

    }

    /**
     * 通過目前日期解析月曆周、财年周,并拼接成字元串
     *
     * @param calendar 目前日期
     * @author: leiming5
     */
    private void setWeekAndFiscalWeek(Calendar calendar) {

        // 當月第幾天
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
        // 當周第幾天
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

        int numberOfDayInMonth = getCurrentMonthLastDay(calendar);
        String weekStr_1 = "W" + weekNumber;

        int weekStart = (dayOfMonth - dayOfWeek + 1);
        int weekEnd = (dayOfMonth - dayOfWeek + 7);

        Calendar calendarOne = Calendar.getInstance();
        calendarOne.setTime(date);

        /**
         * 月初,跨月:當月的第幾天 小于 當周的第幾天,day of month < day of week()  ()
         * 财年周,需要拆分,月末最後一天即可
         * 普通周,不拆分,找到上一個月的時間,擷取上一個月的年份、月份、當月天數,;
         */
        if (dayOfMonth < dayOfWeek) {

            calendarOne.add(Calendar.MONTH, -1);
            int lastMonthNumber = calendarOne.get(Calendar.MONTH) + 1;
            int lastNumberOfDay = getCurrentMonthLastDay(calendarOne);

            this.week = weekStr_1;
            this.weekStart = lastMonthNumber + "/" + (lastNumberOfDay + dayOfMonth - dayOfWeek + 1);
            this.weekEnd = this.monthNumber + "/" + weekEnd;

            this.fiscalWeek = weekStr_1 + "-2";
            this.fiscalWeekStart = this.monthNumber + "/" + 1;
            this.fiscalWeekEnd = this.monthNumber + "/" + weekEnd;
        }

        // 月中,不跨月,
        if (dayOfMonth >= dayOfWeek && (numberOfDayInMonth - dayOfMonth) >= (7 - dayOfWeek)) {
            this.week = weekStr_1;
            this.weekStart = this.monthNumber + "/" + weekStart;
            this.weekEnd = this.monthNumber + "/" + weekEnd;

            this.fiscalWeek = weekStr_1;
            this.fiscalWeekStart = this.monthNumber + "/" + weekStart;
            this.fiscalWeekEnd = this.monthNumber + "/" + weekEnd;
        }

        /**
         * 月末,跨月:當月剩餘的天數 小于 當周剩餘的天數,day of month < day of week()
         *  财年周,需要拆分,月末最後一天即可
         *  普通周,不拆分,找到下一個月的時間;
         */
        if ((numberOfDayInMonth - dayOfMonth) < (7 - dayOfWeek)) {

            calendarOne.add(Calendar.MONTH, +1);
            int nextMonthNumber = calendarOne.get(Calendar.MONTH) + 1;

            this.week = weekStr_1;
            this.weekStart = this.monthNumber + "/" + weekStart;
            this.weekEnd = nextMonthNumber + "/" + (7 + dayOfMonth - dayOfWeek - numberOfDayInMonth);

            this.fiscalWeek = weekStr_1 + "-1";
            this.fiscalWeekStart = this.monthNumber + "/" + weekStart;
            this.fiscalWeekEnd = this.monthNumber + "/" + numberOfDayInMonth;
        }

    }


    /**
     * 擷取當月天數
     *
     * @return 擷取目前月天數;
     * @author: leiming5
     */
    public int getCurrentMonthLastDay(Calendar calendar) {

        calendar.set(Calendar.DATE, 1);//把日期設定為當月第一天
        calendar.roll(Calendar.DATE, -1);//日期復原一天,也就是最後一天
        return calendar.get(Calendar.DATE);
    }


    /**
     * 财年的差別在于:年,和季度(月不變,周:财年周要拆分,月曆周不拆分)
     *
     * @param monthNumber
     */
    public void setByMonth(Integer monthNumber) {

        this.month = monthNumber.toString();
        this.fiscalMonth = this.month;
        this.quarter = "Q" + this.quarterNumber;

        this.fiscalYear = "FY" + this.year;
        this.fiscalQuarter = "Q" + (this.quarterNumber - 1);

        if (1 <= monthNumber && monthNumber <= 3) {
            this.fiscalYear = "FY" + (this.year - 1);
            this.fiscalQuarter = "Q" + (this.quarterNumber + 3);
        }

    }
}
           

參考:

https://www.cnblogs.com/sunbr/p/12740937.html