Commit f2dcfd12510ac1085e9f95fca0008a769e9189aa

Authored by 谭毅彬
1 parent f3c3d3dd

根据创建时间定时删除指定表记录信息初版提交

Signed-off-by: TanYibin <5491541@qq.com>
ant-design-vue-jeecg/src/views/system/QuartzJobList.vue
... ... @@ -43,8 +43,7 @@
43 43 <a-dropdown v-if="selectedRowKeys.length > 0">
44 44 <a-menu slot="overlay">
45 45 <a-menu-item key="1" @click="batchDel">
46   - <a-icon type="delete"/>
47   - 删除
  46 + <a-icon type="delete"/>删除
48 47 </a-menu-item>
49 48 </a-menu>
50 49 <a-button style="margin-left: 8px"> 批量操作
... ... @@ -84,14 +83,12 @@
84 83  
85 84  
86 85 <span slot="action" slot-scope="text, record">
87   - <a @click="resumeJob(record)" v-if="record.status==-1">启动</a>
88   - <a @click="pauseJob(record)" v-if="record.status==0">停止</a>
89   -
90   - <a-divider type="vertical"/>
  86 + <a @click="resumeJob(record)" v-if="record.status==-1">启动<a-divider type="vertical"/></a>
  87 + <a @click="pauseJob(record)" v-if="record.status==0">停止<a-divider type="vertical"/></a>
  88 + <a @click="executeImmediately(record)">执行一次<a-divider type="vertical"/></a>
91 89 <a-dropdown>
92 90 <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
93 91 <a-menu slot="overlay">
94   - <a-menu-item><a @click="executeImmediately(record)">执行一次</a></a-menu-item>
95 92 <a-menu-item><a @click="handleEdit(record)">编辑</a></a-menu-item>
96 93 <a-menu-item>
97 94 <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
... ... @@ -163,7 +160,7 @@ export default {
163 160 {
164 161 title: '参数',
165 162 align: "center",
166   - width: 150,
  163 + width: 170,
167 164 dataIndex: 'parameter',
168 165 scopedSlots: {customRender: 'parameterRender'},
169 166 },
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/TableCleanTesk.java 0 → 100644
  1 +package org.jeecg.modules.wms.monitor.job;
  2 +
  3 +import java.lang.reflect.Field;
  4 +import java.lang.reflect.ParameterizedType;
  5 +import java.time.LocalDateTime;
  6 +import java.time.temporal.ChronoUnit;
  7 +import java.util.ArrayList;
  8 +import java.util.List;
  9 +
  10 +import org.apache.ibatis.session.SqlSession;
  11 +import org.jeecg.common.util.DateUtils;
  12 +import org.jeecg.modules.wms.monitor.job.dto.TableCleanDto;
  13 +import org.jeecg.utils.LocalDateUtils;
  14 +import org.quartz.DisallowConcurrentExecution;
  15 +import org.quartz.Job;
  16 +import org.quartz.JobExecutionContext;
  17 +import org.quartz.JobExecutionException;
  18 +import org.quartz.PersistJobDataAfterExecution;
  19 +import org.springframework.beans.factory.annotation.Autowired;
  20 +
  21 +import com.alibaba.fastjson.JSON;
  22 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  23 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  24 +
  25 +import cn.hutool.core.util.StrUtil;
  26 +import dm.jdbc.util.ReflectUtil;
  27 +import lombok.extern.slf4j.Slf4j;
  28 +
  29 +@Slf4j
  30 +@PersistJobDataAfterExecution
  31 +@DisallowConcurrentExecution
  32 +public class TableCleanTesk implements Job {
  33 +
  34 + private String parameter;
  35 +
  36 + @Autowired
  37 + private SqlSession sqlSession;
  38 +
  39 + public void setParameter(String parameter) {
  40 + this.parameter = parameter;
  41 + }
  42 +
  43 + @Override
  44 + public void execute(JobExecutionContext context) throws JobExecutionException {
  45 + try {
  46 + log.info(StrUtil.format("定时任务 TableCleanTesk 参数:{},执行时间:{}", this.parameter, DateUtils.getTimestamp()));
  47 + List<TableCleanDto> tableCleanList = JSON.parseArray(this.parameter, TableCleanDto.class);
  48 + if (tableCleanList != null && tableCleanList.size() > 0) {
  49 + for (TableCleanDto tableCleanDto : tableCleanList) {
  50 + Class mapperClass = Class.forName(tableCleanDto.getMapperName());
  51 + ParameterizedType parameterizedType = (ParameterizedType)mapperClass.getGenericInterfaces()[0];
  52 + String className = parameterizedType.getActualTypeArguments()[0].getTypeName();
  53 + Field createTimeField = ReflectUtil.getField(Class.forName(className), "createTime");
  54 + if (createTimeField != null) {
  55 + QueryWrapper<?> queryWrapper = new QueryWrapper<>();
  56 + LocalDateTime createTime = LocalDateUtils.minus(LocalDateTime.now(), tableCleanDto.getRetentionDays(), ChronoUnit.DAYS);
  57 + queryWrapper.select("id").lt("create_time", createTime);
  58 + BaseMapper baseMapper = (BaseMapper)this.sqlSession.getMapper(mapperClass);
  59 + Integer deleteCount = baseMapper.delete(queryWrapper);
  60 + log.info("定时任务 TableCleanTesk 删除 {} {} 天前数据 {} 行", className, tableCleanDto.getRetentionDays(), deleteCount);
  61 + }
  62 + }
  63 + }
  64 + } catch (ClassNotFoundException e) {
  65 + e.printStackTrace();
  66 + }
  67 + }
  68 +
  69 + public static void main(String[] args) {
  70 + List<TableCleanDto> tableCleanList = new ArrayList<TableCleanDto>();
  71 + TableCleanDto tableCleanDto = new TableCleanDto();
  72 + tableCleanDto.setMapperName("org.jeecg.modules.system.mapper.SysLogMapper");
  73 + tableCleanDto.setRetentionDays(90);
  74 + tableCleanDto.setMapperName("org.jeecg.modules.system.mapper.SysLogMapper");
  75 + tableCleanDto.setRetentionDays(90);
  76 + tableCleanList.add(tableCleanDto);
  77 + System.out.println(JSON.toJSONString(tableCleanList));
  78 + }
  79 +}
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/dto/TableCleanDto.java 0 → 100644
  1 +package org.jeecg.modules.wms.monitor.job.dto;
  2 +
  3 +import org.jeecg.modules.wms.monitor.job.TableCleanTesk;
  4 +
  5 +import lombok.Data;
  6 +
  7 +@Data
  8 +public class TableCleanDto {
  9 +
  10 + /** 需要清除的Mapper对象 */
  11 + private String mapperName;
  12 +
  13 + /** 保留天数 */
  14 + private Integer retentionDays;
  15 +
  16 +}
0 17 \ No newline at end of file
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java
... ... @@ -85,4 +85,9 @@ public class OperationLog implements Serializable {
85 85 @Excel(name = "操作人姓名", width = 15)
86 86 @ApiModelProperty(value = "操作人姓名")
87 87 private java.lang.String operatorName;
  88 +
  89 + /** 创建日期 */
  90 + @Excel(name = "创建日期", width = 15)
  91 + @ApiModelProperty(value = "创建日期")
  92 + private java.util.Date createTime;
88 93 }
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java
... ... @@ -120,17 +120,7 @@ public class OperationLogServiceImpl extends ServiceImpl&lt;OperationLogMapper, Ope
120 120 }
121 121 } else {
122 122 Thread.sleep(1000); // 确保日志输出顺序
123   - OperationLog operationLog = new OperationLog();
124   - operationLog.setBizId(logDTO.getBizId());
125   - operationLog.setOperationMsg(StringUtils.substring(logDTO.getMsg(), 0, 1000));
126   - operationLog.setBizType(logDTO.getBizType());
127   - operationLog.setBizTag(logDTO.getTag());
128   - operationLog.setContentException(StringUtils.substring(logDTO.getException(), 0, 1000));
129   - operationLog.setContentReturn(StringUtils.substring(logDTO.getReturnStr(), 0, 1000));
130   - operationLog.setOperationCostTime(logDTO.getExecutionTime());
131   - operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0);
132   - operationLog.setOperationTime(logDTO.getOperateDate());
133   - operationLog.setOperatorName(logDTO.getOperatorId());
  123 + OperationLog operationLog = createOperationLog(logDTO);
134 124 operationLogList.add(operationLog);
135 125 }
136 126 return this.saveBatch(operationLogList);
... ... @@ -140,6 +130,21 @@ public class OperationLogServiceImpl extends ServiceImpl&lt;OperationLogMapper, Ope
140 130 }
141 131 }
142 132  
  133 + private OperationLog createOperationLog(LogDTO logDTO) {
  134 + OperationLog operationLog = new OperationLog();
  135 + operationLog.setBizId(logDTO.getBizId());
  136 + operationLog.setOperationMsg(StringUtils.substring(logDTO.getMsg(), 0, 1000));
  137 + operationLog.setBizType(logDTO.getBizType());
  138 + operationLog.setBizTag(logDTO.getTag());
  139 + operationLog.setContentException(StringUtils.substring(logDTO.getException(), 0, 1000));
  140 + operationLog.setContentReturn(StringUtils.substring(logDTO.getReturnStr(), 0, 1000));
  141 + operationLog.setOperationCostTime(logDTO.getExecutionTime());
  142 + operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0);
  143 + operationLog.setOperationTime(logDTO.getOperateDate());
  144 + operationLog.setOperatorName(logDTO.getOperatorId());
  145 + return operationLog;
  146 + }
  147 +
143 148 private List<OperationLog> createOperationLogs(LogDTO logDTO, Class<?> clazz, String bizIdMethodName, String text, String... msgMethodNames) {
144 149 List<OperationLog> operationLogList = new ArrayList<OperationLog>();
145 150 List<?> detailList = JSON.parseArray(logDTO.getExtra(), clazz);
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/LocalDateUtils.java 0 → 100644
  1 +package org.jeecg.utils;
  2 +
  3 +import java.time.DayOfWeek;
  4 +import java.time.LocalDate;
  5 +import java.time.LocalDateTime;
  6 +import java.time.LocalTime;
  7 +import java.time.format.DateTimeFormatter;
  8 +import java.time.temporal.ChronoUnit;
  9 +import java.time.temporal.TemporalAccessor;
  10 +import java.time.temporal.TemporalAdjusters;
  11 +import java.util.ArrayList;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * Java8日期时间工具类
  16 + * @author JourWon
  17 + * @date 2020/12/13
  18 + */
  19 +public class LocalDateUtils {
  20 +
  21 + /**
  22 + * 显示年月日时分秒,例如 2015-08-11 09:51:53.
  23 + */
  24 + public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
  25 +
  26 + /**
  27 + * 仅显示年月日,例如 2015-08-11.
  28 + */
  29 + public static final String DATE_PATTERN = "yyyy-MM-dd";
  30 +
  31 + /**
  32 + * 仅显示时分秒,例如 09:51:53.
  33 + */
  34 + public static final String TIME_PATTERN = "HH:mm:ss";
  35 +
  36 + /**
  37 + * 显示年月日时分秒(无符号),例如 20150811095153.
  38 + */
  39 + public static final String UNSIGNED_DATETIME_PATTERN = "yyyyMMddHHmmss";
  40 +
  41 + /**
  42 + * 仅显示年月日(无符号),例如 20150811.
  43 + */
  44 + public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd";
  45 +
  46 + /**
  47 + * 春天;
  48 + */
  49 + public static final Integer SPRING = 1;
  50 +
  51 + /**
  52 + * 夏天;
  53 + */
  54 + public static final Integer SUMMER = 2;
  55 +
  56 + /**
  57 + * 秋天;
  58 + */
  59 + public static final Integer AUTUMN = 3;
  60 +
  61 + /**
  62 + * 冬天;
  63 + */
  64 + public static final Integer WINTER = 4;
  65 +
  66 + /**
  67 + * 星期日;
  68 + */
  69 + public static final String SUNDAY = "星期日";
  70 +
  71 + /**
  72 + * 星期一;
  73 + */
  74 + public static final String MONDAY = "星期一";
  75 +
  76 + /**
  77 + * 星期二;
  78 + */
  79 + public static final String TUESDAY = "星期二";
  80 +
  81 + /**
  82 + * 星期三;
  83 + */
  84 + public static final String WEDNESDAY = "星期三";
  85 +
  86 + /**
  87 + * 星期四;
  88 + */
  89 + public static final String THURSDAY = "星期四";
  90 +
  91 + /**
  92 + * 星期五;
  93 + */
  94 + public static final String FRIDAY = "星期五";
  95 +
  96 + /**
  97 + * 星期六;
  98 + */
  99 + public static final String SATURDAY = "星期六";
  100 +
  101 + /**
  102 + * 年
  103 + */
  104 + private static final String YEAR = "year";
  105 +
  106 + /**
  107 + * 月
  108 + */
  109 + private static final String MONTH = "month";
  110 +
  111 + /**
  112 + * 周
  113 + */
  114 + private static final String WEEK = "week";
  115 +
  116 + /**
  117 + * 日
  118 + */
  119 + private static final String DAY = "day";
  120 +
  121 + /**
  122 + * 时
  123 + */
  124 + private static final String HOUR = "hour";
  125 +
  126 + /**
  127 + * 分
  128 + */
  129 + private static final String MINUTE = "minute";
  130 +
  131 + /**
  132 + * 秒
  133 + */
  134 + private static final String SECOND = "second";
  135 +
  136 + /**
  137 + * 获取当前日期和时间字符串.
  138 + * @return String 日期时间字符串,例如 2015-08-11 09:51:53
  139 + */
  140 + public static String getLocalDateTimeStr() {
  141 + return format(LocalDateTime.now(), DATETIME_PATTERN);
  142 + }
  143 +
  144 + /**
  145 + * 获取当前日期字符串.
  146 + * @return String 日期字符串,例如2015-08-11
  147 + */
  148 + public static String getLocalDateStr() {
  149 + return format(LocalDate.now(), DATE_PATTERN);
  150 + }
  151 +
  152 + /**
  153 + * 获取当前时间字符串.
  154 + * @return String 时间字符串,例如 09:51:53
  155 + */
  156 + public static String getLocalTimeStr() {
  157 + return format(LocalTime.now(), TIME_PATTERN);
  158 + }
  159 +
  160 + /**
  161 + * 获取当前星期字符串.
  162 + * @return String 当前星期字符串,例如 星期二
  163 + */
  164 + public static String getDayOfWeekStr() {
  165 + return format(LocalDate.now(), "E");
  166 + }
  167 +
  168 + /**
  169 + * 获取指定日期是星期几
  170 + * @param localDate 日期
  171 + * @return String 星期几
  172 + */
  173 + public static String getDayOfWeekStr(LocalDate localDate) {
  174 + String[] weekOfDays = {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
  175 + int dayOfWeek = localDate.getDayOfWeek().getValue() - 1;
  176 + return weekOfDays[dayOfWeek];
  177 + }
  178 +
  179 + /**
  180 + * 获取日期时间字符串
  181 + * @param temporal 需要转化的日期时间
  182 + * @param pattern 时间格式
  183 + * @return String 日期时间字符串,例如 2015-08-11 09:51:53
  184 + */
  185 + public static String format(TemporalAccessor temporal, String pattern) {
  186 + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
  187 + return dateTimeFormatter.format(temporal);
  188 + }
  189 +
  190 + /**
  191 + * 日期时间字符串转换为日期时间(java.time.LocalDateTime)
  192 + * @param localDateTimeStr 日期时间字符串
  193 + * @param pattern 日期时间格式 例如DATETIME_PATTERN
  194 + * @return LocalDateTime 日期时间
  195 + */
  196 + public static LocalDateTime parseLocalDateTime(String localDateTimeStr, String pattern) {
  197 + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
  198 + return LocalDateTime.parse(localDateTimeStr, dateTimeFormatter);
  199 + }
  200 +
  201 + /**
  202 + * 日期字符串转换为日期(java.time.LocalDate)
  203 + * @param localDateStr 日期字符串
  204 + * @param pattern 日期格式 例如DATE_PATTERN
  205 + * @return LocalDate 日期
  206 + */
  207 + public static LocalDate parseLocalDate(String localDateStr, String pattern) {
  208 + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
  209 + return LocalDate.parse(localDateStr, dateTimeFormatter);
  210 + }
  211 +
  212 + /**
  213 + * 获取指定日期时间加上指定数量日期时间单位之后的日期时间.
  214 + * @param localDateTime 日期时间
  215 + * @param num 数量
  216 + * @param chronoUnit 日期时间单位
  217 + * @return LocalDateTime 新的日期时间
  218 + */
  219 + public static LocalDateTime plus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
  220 + return localDateTime.plus(num, chronoUnit);
  221 + }
  222 +
  223 + /**
  224 + * 获取指定日期时间减去指定数量日期时间单位之后的日期时间.
  225 + * @param localDateTime 日期时间
  226 + * @param num 数量
  227 + * @param chronoUnit 日期时间单位
  228 + * @return LocalDateTime 新的日期时间
  229 + */
  230 + public static LocalDateTime minus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
  231 + return localDateTime.minus(num, chronoUnit);
  232 + }
  233 +
  234 + /**
  235 + * 根据ChronoUnit计算两个日期时间之间相隔日期时间
  236 + * @param start 开始日期时间
  237 + * @param end 结束日期时间
  238 + * @param chronoUnit 日期时间单位
  239 + * @return long 相隔日期时间
  240 + */
  241 + public static long getChronoUnitBetween(LocalDateTime start, LocalDateTime end, ChronoUnit chronoUnit) {
  242 + return Math.abs(start.until(end, chronoUnit));
  243 + }
  244 +
  245 + /**
  246 + * 根据ChronoUnit计算两个日期之间相隔年数或月数或天数
  247 + * @param start 开始日期
  248 + * @param end 结束日期
  249 + * @param chronoUnit 日期时间单位,(ChronoUnit.YEARS,ChronoUnit.MONTHS,ChronoUnit.WEEKS,ChronoUnit.DAYS)
  250 + * @return long 相隔年数或月数或天数
  251 + */
  252 + public static long getChronoUnitBetween(LocalDate start, LocalDate end, ChronoUnit chronoUnit) {
  253 + return Math.abs(start.until(end, chronoUnit));
  254 + }
  255 +
  256 + /**
  257 + * 获取本年第一天的日期字符串
  258 + * @return String 格式:yyyy-MM-dd 00:00:00
  259 + */
  260 + public static String getFirstDayOfYearStr() {
  261 + return getFirstDayOfYearStr(LocalDateTime.now());
  262 + }
  263 +
  264 + /**
  265 + * 获取本年最后一天的日期字符串
  266 + * @return String 格式:yyyy-MM-dd 23:59:59
  267 + */
  268 + public static String getLastDayOfYearStr() {
  269 + return getLastDayOfYearStr(LocalDateTime.now());
  270 + }
  271 +
  272 + /**
  273 + * 获取指定日期当年第一天的日期字符串
  274 + * @param localDateTime 指定日期时间
  275 + * @return String 格式:yyyy-MM-dd 00:00:00
  276 + */
  277 + public static String getFirstDayOfYearStr(LocalDateTime localDateTime) {
  278 + return getFirstDayOfYearStr(localDateTime, DATETIME_PATTERN);
  279 + }
  280 +
  281 + /**
  282 + * 获取指定日期当年最后一天的日期字符串
  283 + * @param localDateTime 指定日期时间
  284 + * @return String 格式:yyyy-MM-dd 23:59:59
  285 + */
  286 + public static String getLastDayOfYearStr(LocalDateTime localDateTime) {
  287 + return getLastDayOfYearStr(localDateTime, DATETIME_PATTERN);
  288 + }
  289 +
  290 + /**
  291 + * 获取指定日期当年第一天的日期字符串,带日期格式化参数
  292 + * @param localDateTime 指定日期时间
  293 + * @param pattern 日期时间格式
  294 + * @return String 格式:yyyy-MM-dd 00:00:00
  295 + */
  296 + public static String getFirstDayOfYearStr(LocalDateTime localDateTime, String pattern) {
  297 + return format(localDateTime.withDayOfYear(1).withHour(0).withMinute(0).withSecond(0), pattern);
  298 + }
  299 +
  300 + /**
  301 + * 获取指定日期当年最后一天的日期字符串,带日期格式化参数
  302 + * @param localDateTime 指定日期时间
  303 + * @param pattern 日期时间格式
  304 + * @return String 格式:yyyy-MM-dd 23:59:59
  305 + */
  306 + public static String getLastDayOfYearStr(LocalDateTime localDateTime, String pattern) {
  307 + return format(localDateTime.with(TemporalAdjusters.lastDayOfYear()).withHour(23).withMinute(59).withSecond(59), pattern);
  308 + }
  309 +
  310 + /**
  311 + * 获取本月第一天的日期字符串
  312 + * @return String 格式:yyyy-MM-dd 00:00:00
  313 + */
  314 + public static String getFirstDayOfMonthStr() {
  315 + return getFirstDayOfMonthStr(LocalDateTime.now());
  316 + }
  317 +
  318 + /**
  319 + * 获取本月最后一天的日期字符串
  320 + * @return String 格式:yyyy-MM-dd 23:59:59
  321 + */
  322 + public static String getLastDayOfMonthStr() {
  323 + return getLastDayOfMonthStr(LocalDateTime.now());
  324 + }
  325 +
  326 + /**
  327 + * 获取指定日期当月第一天的日期字符串
  328 + * @param localDateTime 指定日期时间
  329 + * @return String 格式:yyyy-MM-dd 23:59:59
  330 + */
  331 + public static String getFirstDayOfMonthStr(LocalDateTime localDateTime) {
  332 + return getFirstDayOfMonthStr(localDateTime, DATETIME_PATTERN);
  333 + }
  334 +
  335 + /**
  336 + * 获取指定日期当月最后一天的日期字符串
  337 + * @param localDateTime 指定日期时间
  338 + * @return String 格式:yyyy-MM-dd 23:59:59
  339 + */
  340 + public static String getLastDayOfMonthStr(LocalDateTime localDateTime) {
  341 + return getLastDayOfMonthStr(localDateTime, DATETIME_PATTERN);
  342 + }
  343 +
  344 + /**
  345 + * 获取指定日期当月第一天的日期字符串,带日期格式化参数
  346 + * @param localDateTime 指定日期时间
  347 + * @return String 格式:yyyy-MM-dd 00:00:00
  348 + */
  349 + public static String getFirstDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
  350 + return format(localDateTime.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0), pattern);
  351 + }
  352 +
  353 + /**
  354 + * 获取指定日期当月最后一天的日期字符串,带日期格式化参数
  355 + * @param localDateTime 指定日期时间
  356 + * @param pattern 日期时间格式
  357 + * @return String 格式:yyyy-MM-dd 23:59:59
  358 + */
  359 + public static String getLastDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
  360 + return format(localDateTime.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59), pattern);
  361 + }
  362 +
  363 + /**
  364 + * 获取本周第一天的日期字符串
  365 + * @return String 格式:yyyy-MM-dd 00:00:00
  366 + */
  367 + public static String getFirstDayOfWeekStr() {
  368 + return getFirstDayOfWeekStr(LocalDateTime.now());
  369 + }
  370 +
  371 + /**
  372 + * 获取本周最后一天的日期字符串
  373 + * @return String 格式:yyyy-MM-dd 23:59:59
  374 + */
  375 + public static String getLastDayOfWeekStr() {
  376 + return getLastDayOfWeekStr(LocalDateTime.now());
  377 + }
  378 +
  379 + /**
  380 + * 获取指定日期当周第一天的日期字符串,这里第一天为周一
  381 + * @param localDateTime 指定日期时间
  382 + * @return String 格式:yyyy-MM-dd 00:00:00
  383 + */
  384 + public static String getFirstDayOfWeekStr(LocalDateTime localDateTime) {
  385 + return getFirstDayOfWeekStr(localDateTime, DATETIME_PATTERN);
  386 + }
  387 +
  388 + /**
  389 + * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日
  390 + * @param localDateTime 指定日期时间
  391 + * @return String 格式:yyyy-MM-dd 23:59:59
  392 + */
  393 + public static String getLastDayOfWeekStr(LocalDateTime localDateTime) {
  394 + return getLastDayOfWeekStr(localDateTime, DATETIME_PATTERN);
  395 + }
  396 +
  397 + /**
  398 + * 获取指定日期当周第一天的日期字符串,这里第一天为周一,带日期格式化参数
  399 + * @param localDateTime 指定日期时间
  400 + * @param pattern 日期时间格式
  401 + * @return String 格式:yyyy-MM-dd 00:00:00
  402 + */
  403 + public static String getFirstDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
  404 + return format(localDateTime.with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0), pattern);
  405 + }
  406 +
  407 + /**
  408 + * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日,带日期格式化参数
  409 + * @param localDateTime 指定日期时间
  410 + * @param pattern 日期时间格式
  411 + * @return String 格式:yyyy-MM-dd 23:59:59
  412 + */
  413 + public static String getLastDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
  414 + return format(localDateTime.with(DayOfWeek.SUNDAY).withHour(23).withMinute(59).withSecond(59), pattern);
  415 + }
  416 +
  417 + /**
  418 + * 获取今天开始时间的日期字符串
  419 + * @return String 格式:yyyy-MM-dd 00:00:00
  420 + */
  421 + public static String getStartTimeOfDayStr() {
  422 + return getStartTimeOfDayStr(LocalDateTime.now());
  423 + }
  424 +
  425 + /**
  426 + * 获取今天结束时间的日期字符串
  427 + * @return String 格式:yyyy-MM-dd 23:59:59
  428 + */
  429 + public static String getEndTimeOfDayStr() {
  430 + return getEndTimeOfDayStr(LocalDateTime.now());
  431 + }
  432 +
  433 + /**
  434 + * 获取指定日期开始时间的日期字符串
  435 + * @param localDateTime 指定日期时间
  436 + * @return String 格式:yyyy-MM-dd 00:00:00
  437 + */
  438 + public static String getStartTimeOfDayStr(LocalDateTime localDateTime) {
  439 + return getStartTimeOfDayStr(localDateTime, DATETIME_PATTERN);
  440 + }
  441 +
  442 + /**
  443 + * 获取指定日期结束时间的日期字符串
  444 + * @param localDateTime 指定日期时间
  445 + * @return String 格式:yyyy-MM-dd 23:59:59
  446 + */
  447 + public static String getEndTimeOfDayStr(LocalDateTime localDateTime) {
  448 + return getEndTimeOfDayStr(localDateTime, DATETIME_PATTERN);
  449 + }
  450 +
  451 + /**
  452 + * 获取指定日期开始时间的日期字符串,带日期格式化参数
  453 + * @param localDateTime 指定日期时间
  454 + * @param pattern 日期时间格式
  455 + * @return String 格式:yyyy-MM-dd HH:mm:ss
  456 + */
  457 + public static String getStartTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
  458 + return format(localDateTime.withHour(0).withMinute(0).withSecond(0), pattern);
  459 + }
  460 +
  461 + /**
  462 + * 获取指定日期结束时间的日期字符串,带日期格式化参数
  463 + * @param localDateTime 指定日期时间
  464 + * @param pattern 日期时间格式
  465 + * @return String 格式:yyyy-MM-dd 23:59:59
  466 + */
  467 + public static String getEndTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
  468 + return format(localDateTime.withHour(23).withMinute(59).withSecond(59), pattern);
  469 + }
  470 +
  471 + /**
  472 + * 切割日期。按照周期切割成小段日期段。例如: <br>
  473 + * @param startDate 开始日期(yyyy-MM-dd)
  474 + * @param endDate 结束日期(yyyy-MM-dd)
  475 + * @param period 周期(天,周,月,年)
  476 + * @return 切割之后的日期集合
  477 + * <li>startDate="2019-02-28",endDate="2019-03-05",period="day"</li>
  478 + * <li>结果为:[2019-02-28, 2019-03-01, 2019-03-02, 2019-03-03, 2019-03-04, 2019-03-05]</li><br>
  479 + * <li>startDate="2019-02-28",endDate="2019-03-25",period="week"</li>
  480 + * <li>结果为:[2019-02-28,2019-03-06, 2019-03-07,2019-03-13, 2019-03-14,2019-03-20,
  481 + * 2019-03-21,2019-03-25]</li><br>
  482 + * <li>startDate="2019-02-28",endDate="2019-05-25",period="month"</li>
  483 + * <li>结果为:[2019-02-28,2019-02-28, 2019-03-01,2019-03-31, 2019-04-01,2019-04-30,
  484 + * 2019-05-01,2019-05-25]</li><br>
  485 + * <li>startDate="2019-02-28",endDate="2020-05-25",period="year"</li>
  486 + * <li>结果为:[2019-02-28,2019-12-31, 2020-01-01,2020-05-25]</li><br>
  487 + */
  488 + public static List<String> listDateStrs(String startDate, String endDate, String period) {
  489 + List<String> result = new ArrayList<>();
  490 + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN);
  491 + LocalDate end = LocalDate.parse(endDate, dateTimeFormatter);
  492 + LocalDate start = LocalDate.parse(startDate, dateTimeFormatter);
  493 + LocalDate tmp = start;
  494 + switch (period) {
  495 + case DAY:
  496 + while (start.isBefore(end) || start.isEqual(end)) {
  497 + result.add(start.toString());
  498 + start = start.plusDays(1);
  499 + }
  500 + break;
  501 + case WEEK:
  502 + while (tmp.isBefore(end) || tmp.isEqual(end)) {
  503 + if (tmp.plusDays(6).isAfter(end)) {
  504 + result.add(tmp.toString() + "," + end);
  505 + } else {
  506 + result.add(tmp.toString() + "," + tmp.plusDays(6));
  507 + }
  508 + tmp = tmp.plusDays(7);
  509 + }
  510 + break;
  511 + case MONTH:
  512 + while (tmp.isBefore(end) || tmp.isEqual(end)) {
  513 + LocalDate lastDayOfMonth = tmp.with(TemporalAdjusters.lastDayOfMonth());
  514 + if (lastDayOfMonth.isAfter(end)) {
  515 + result.add(tmp.toString() + "," + end);
  516 + } else {
  517 + result.add(tmp.toString() + "," + lastDayOfMonth);
  518 + }
  519 + tmp = lastDayOfMonth.plusDays(1);
  520 + }
  521 + break;
  522 + case YEAR:
  523 + while (tmp.isBefore(end) || tmp.isEqual(end)) {
  524 + LocalDate lastDayOfYear = tmp.with(TemporalAdjusters.lastDayOfYear());
  525 + if (lastDayOfYear.isAfter(end)) {
  526 + result.add(tmp.toString() + "," + end);
  527 + } else {
  528 + result.add(tmp.toString() + "," + lastDayOfYear);
  529 + }
  530 + tmp = lastDayOfYear.plusDays(1);
  531 + }
  532 + break;
  533 + default:
  534 + break;
  535 + }
  536 + return result;
  537 + }
  538 +
  539 + public static void main(String[] args) {
  540 + System.out.println(getLocalDateTimeStr());
  541 + System.out.println(getLocalDateStr());
  542 + System.out.println(getLocalTimeStr());
  543 + System.out.println(getDayOfWeekStr());
  544 + System.out.println(getDayOfWeekStr(LocalDate.now()));
  545 +
  546 + System.out.println("========");
  547 + System.out.println(format(LocalDate.now(), UNSIGNED_DATE_PATTERN));
  548 +
  549 + System.out.println("========");
  550 + System.out.println(parseLocalDateTime("2020-12-13 11:14:12", DATETIME_PATTERN));
  551 + System.out.println(parseLocalDate("2020-12-13", DATE_PATTERN));
  552 +//
  553 +// System.out.println("========");
  554 +// System.out.println(plus(LocalDateTime.now(), 3, ChronoUnit.HOURS));
  555 + System.out.println(format(minus(LocalDateTime.now(), 90, ChronoUnit.DAYS), DATETIME_PATTERN));
  556 + System.out.println(format(LocalDate.now(), UNSIGNED_DATE_PATTERN));
  557 +// System.out.println("========");
  558 +// System.out.println(getChronoUnitBetween(LocalDateTime.now(), parseLocalDateTime("2020-12-12 12:03:12", DATETIME_PATTERN), ChronoUnit.MINUTES));
  559 +// System.out.println(getChronoUnitBetween(LocalDate.now(), parseLocalDate("2021-12-12", DATE_PATTERN), ChronoUnit.WEEKS));
  560 +//
  561 +// System.out.println("========");
  562 +// System.out.println(getFirstDayOfYearStr());
  563 +// System.out.println(getFirstDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
  564 +// System.out.println(getFirstDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
  565 +//
  566 +// System.out.println(getLastDayOfYearStr());
  567 +// System.out.println(getLastDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
  568 +// System.out.println(getLastDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
  569 +//
  570 +// System.out.println("========");
  571 +// System.out.println(getFirstDayOfMonthStr());
  572 +// System.out.println(getFirstDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
  573 +// System.out.println(getFirstDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
  574 +//
  575 +// System.out.println(getLastDayOfMonthStr());
  576 +// System.out.println(getLastDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
  577 +// System.out.println(getLastDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
  578 +//
  579 +// System.out.println("========");
  580 +// System.out.println(getFirstDayOfWeekStr());
  581 +// System.out.println(getFirstDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
  582 +// System.out.println(getFirstDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
  583 +//
  584 +// System.out.println(getLastDayOfWeekStr());
  585 +// System.out.println(getLastDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
  586 +// System.out.println(getLastDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
  587 +//
  588 +// System.out.println("========");
  589 +// System.out.println(getStartTimeOfDayStr());
  590 +// System.out.println(getStartTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
  591 +// System.out.println(getStartTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
  592 +//
  593 +// System.out.println(getEndTimeOfDayStr());
  594 +// System.out.println(getEndTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
  595 +// System.out.println(getEndTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
  596 +//
  597 +// System.out.println("========");
  598 +// List<String> dateStrs = listDateStrs("2019-01-30", "2020-12-13", YEAR);
  599 +// for (String dateStr : dateStrs) {
  600 +// System.out.println(dateStr);
  601 +// }
  602 +//
  603 +// System.out.println("========");
  604 +// List<String> dateStrs1 = listDateStrs("2019-01-30", "2020-12-13", MONTH);
  605 +// for (String dateStr : dateStrs1) {
  606 +// System.out.println(dateStr);
  607 +// }
  608 +//
  609 +// System.out.println("========");
  610 +// List<String> dateStrs2 = listDateStrs("2020-12-01", "2020-12-13", DAY);
  611 +// for (String dateStr : dateStrs2) {
  612 +// System.out.println(dateStr);
  613 +// }
  614 + }
  615 +
  616 +}
... ...