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