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
还没有评论,来说两句吧...