diff --git a/ant-design-vue-jeecg/src/views/system/QuartzJobList.vue b/ant-design-vue-jeecg/src/views/system/QuartzJobList.vue
index 8743b80..c387a28 100644
--- a/ant-design-vue-jeecg/src/views/system/QuartzJobList.vue
+++ b/ant-design-vue-jeecg/src/views/system/QuartzJobList.vue
@@ -43,8 +43,7 @@
       <a-dropdown v-if="selectedRowKeys.length > 0">
         <a-menu slot="overlay">
           <a-menu-item key="1" @click="batchDel">
-            <a-icon type="delete"/>
-            删除
+            <a-icon type="delete"/>删除
           </a-menu-item>
         </a-menu>
         <a-button style="margin-left: 8px"> 批量操作
@@ -84,14 +83,12 @@
 
 
         <span slot="action" slot-scope="text, record">
-          <a @click="resumeJob(record)" v-if="record.status==-1">启动</a>
-          <a @click="pauseJob(record)" v-if="record.status==0">停止</a>
-
-          <a-divider type="vertical"/>
+          <a @click="resumeJob(record)" v-if="record.status==-1">启动<a-divider type="vertical"/></a>
+          <a @click="pauseJob(record)" v-if="record.status==0">停止<a-divider type="vertical"/></a>
+          <a @click="executeImmediately(record)">执行一次<a-divider type="vertical"/></a>
           <a-dropdown>
             <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
             <a-menu slot="overlay">
-              <a-menu-item><a @click="executeImmediately(record)">执行一次</a></a-menu-item>
               <a-menu-item><a @click="handleEdit(record)">编辑</a></a-menu-item>
               <a-menu-item>
                 <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
@@ -163,7 +160,7 @@ export default {
         {
           title: '参数',
           align: "center",
-          width: 150,
+          width: 170,
           dataIndex: 'parameter',
           scopedSlots: {customRender: 'parameterRender'},
         },
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/TableCleanTesk.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/TableCleanTesk.java
new file mode 100644
index 0000000..f3a8a84
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/TableCleanTesk.java
@@ -0,0 +1,79 @@
+package org.jeecg.modules.wms.monitor.job;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.ibatis.session.SqlSession;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.wms.monitor.job.dto.TableCleanDto;
+import org.jeecg.utils.LocalDateUtils;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.quartz.PersistJobDataAfterExecution;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import cn.hutool.core.util.StrUtil;
+import dm.jdbc.util.ReflectUtil;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@PersistJobDataAfterExecution
+@DisallowConcurrentExecution
+public class TableCleanTesk implements Job {
+
+    private String parameter;
+
+    @Autowired
+    private SqlSession sqlSession;
+
+    public void setParameter(String parameter) {
+        this.parameter = parameter;
+    }
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        try {
+            log.info(StrUtil.format("定时任务 TableCleanTesk 参数:{},执行时间:{}", this.parameter, DateUtils.getTimestamp()));
+            List<TableCleanDto> tableCleanList = JSON.parseArray(this.parameter, TableCleanDto.class);
+            if (tableCleanList != null && tableCleanList.size() > 0) {
+                for (TableCleanDto tableCleanDto : tableCleanList) {
+                    Class mapperClass = Class.forName(tableCleanDto.getMapperName());
+                    ParameterizedType parameterizedType = (ParameterizedType)mapperClass.getGenericInterfaces()[0];
+                    String className = parameterizedType.getActualTypeArguments()[0].getTypeName();
+                    Field createTimeField = ReflectUtil.getField(Class.forName(className), "createTime");
+                    if (createTimeField != null) {
+                        QueryWrapper<?> queryWrapper = new QueryWrapper<>();
+                        LocalDateTime createTime = LocalDateUtils.minus(LocalDateTime.now(), tableCleanDto.getRetentionDays(), ChronoUnit.DAYS);
+                        queryWrapper.select("id").lt("create_time", createTime);
+                        BaseMapper baseMapper = (BaseMapper)this.sqlSession.getMapper(mapperClass);
+                        Integer deleteCount = baseMapper.delete(queryWrapper);
+                        log.info("定时任务 TableCleanTesk 删除 {} {} 天前数据 {} 行", className, tableCleanDto.getRetentionDays(), deleteCount);
+                    }
+                }
+            }
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) {
+        List<TableCleanDto> tableCleanList = new ArrayList<TableCleanDto>();
+        TableCleanDto tableCleanDto = new TableCleanDto();
+        tableCleanDto.setMapperName("org.jeecg.modules.system.mapper.SysLogMapper");
+        tableCleanDto.setRetentionDays(90);
+        tableCleanDto.setMapperName("org.jeecg.modules.system.mapper.SysLogMapper");
+        tableCleanDto.setRetentionDays(90);
+        tableCleanList.add(tableCleanDto);
+        System.out.println(JSON.toJSONString(tableCleanList));
+    }
+}
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/dto/TableCleanDto.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/dto/TableCleanDto.java
new file mode 100644
index 0000000..2ee907a
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/dto/TableCleanDto.java
@@ -0,0 +1,16 @@
+package org.jeecg.modules.wms.monitor.job.dto;
+
+import org.jeecg.modules.wms.monitor.job.TableCleanTesk;
+
+import lombok.Data;
+
+@Data
+public class TableCleanDto {
+
+    /** 需要清除的Mapper对象 */
+    private String mapperName;
+
+    /** 保留天数 */
+    private Integer retentionDays;
+
+}
\ No newline at end of file
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java
index 8cc8e61..2e2c925 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java
@@ -85,4 +85,9 @@ public class OperationLog implements Serializable {
     @Excel(name = "操作人姓名", width = 15)
     @ApiModelProperty(value = "操作人姓名")
     private java.lang.String operatorName;
+    
+    /** 创建日期 */
+    @Excel(name = "创建日期", width = 15)
+    @ApiModelProperty(value = "创建日期")
+    private java.util.Date createTime;
 }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java
index b3417c0..c5920f4 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java
+++ b/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<OperationLogMapper, Ope
                 }
             } else {
                 Thread.sleep(1000); // 确保日志输出顺序
-                OperationLog operationLog = new OperationLog();
-                operationLog.setBizId(logDTO.getBizId());
-                operationLog.setOperationMsg(StringUtils.substring(logDTO.getMsg(), 0, 1000));
-                operationLog.setBizType(logDTO.getBizType());
-                operationLog.setBizTag(logDTO.getTag());
-                operationLog.setContentException(StringUtils.substring(logDTO.getException(), 0, 1000));
-                operationLog.setContentReturn(StringUtils.substring(logDTO.getReturnStr(), 0, 1000));
-                operationLog.setOperationCostTime(logDTO.getExecutionTime());
-                operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0);
-                operationLog.setOperationTime(logDTO.getOperateDate());
-                operationLog.setOperatorName(logDTO.getOperatorId());
+                OperationLog operationLog = createOperationLog(logDTO);
                 operationLogList.add(operationLog);
             }
             return this.saveBatch(operationLogList);
@@ -140,6 +130,21 @@ public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, Ope
         }
     }
 
+    private OperationLog createOperationLog(LogDTO logDTO) {
+        OperationLog operationLog = new OperationLog();
+        operationLog.setBizId(logDTO.getBizId());
+        operationLog.setOperationMsg(StringUtils.substring(logDTO.getMsg(), 0, 1000));
+        operationLog.setBizType(logDTO.getBizType());
+        operationLog.setBizTag(logDTO.getTag());
+        operationLog.setContentException(StringUtils.substring(logDTO.getException(), 0, 1000));
+        operationLog.setContentReturn(StringUtils.substring(logDTO.getReturnStr(), 0, 1000));
+        operationLog.setOperationCostTime(logDTO.getExecutionTime());
+        operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0);
+        operationLog.setOperationTime(logDTO.getOperateDate());
+        operationLog.setOperatorName(logDTO.getOperatorId());
+        return operationLog;
+    }
+
     private List<OperationLog> createOperationLogs(LogDTO logDTO, Class<?> clazz, String bizIdMethodName, String text, String... msgMethodNames) {
         List<OperationLog> operationLogList = new ArrayList<OperationLog>();
         List<?> detailList = JSON.parseArray(logDTO.getExtra(), clazz);
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/LocalDateUtils.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/LocalDateUtils.java
new file mode 100644
index 0000000..170b441
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/LocalDateUtils.java
@@ -0,0 +1,616 @@
+package org.jeecg.utils;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Java8日期时间工具类
+ * @author JourWon
+ * @date   2020/12/13
+ */
+public class LocalDateUtils {
+
+    /**
+     * 显示年月日时分秒,例如 2015-08-11 09:51:53.
+     */
+    public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+    /**
+     * 仅显示年月日,例如 2015-08-11.
+     */
+    public static final String DATE_PATTERN = "yyyy-MM-dd";
+
+    /**
+     * 仅显示时分秒,例如 09:51:53.
+     */
+    public static final String TIME_PATTERN = "HH:mm:ss";
+
+    /**
+     * 显示年月日时分秒(无符号),例如 20150811095153.
+     */
+    public static final String UNSIGNED_DATETIME_PATTERN = "yyyyMMddHHmmss";
+
+    /**
+     * 仅显示年月日(无符号),例如 20150811.
+     */
+    public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd";
+
+    /**
+     * 春天;
+     */
+    public static final Integer SPRING = 1;
+
+    /**
+     * 夏天;
+     */
+    public static final Integer SUMMER = 2;
+
+    /**
+     * 秋天;
+     */
+    public static final Integer AUTUMN = 3;
+
+    /**
+     * 冬天;
+     */
+    public static final Integer WINTER = 4;
+
+    /**
+     * 星期日;
+     */
+    public static final String SUNDAY = "星期日";
+
+    /**
+     * 星期一;
+     */
+    public static final String MONDAY = "星期一";
+
+    /**
+     * 星期二;
+     */
+    public static final String TUESDAY = "星期二";
+
+    /**
+     * 星期三;
+     */
+    public static final String WEDNESDAY = "星期三";
+
+    /**
+     * 星期四;
+     */
+    public static final String THURSDAY = "星期四";
+
+    /**
+     * 星期五;
+     */
+    public static final String FRIDAY = "星期五";
+
+    /**
+     * 星期六;
+     */
+    public static final String SATURDAY = "星期六";
+
+    /**
+     * 年
+     */
+    private static final String YEAR = "year";
+
+    /**
+     * 月
+     */
+    private static final String MONTH = "month";
+
+    /**
+     * 周
+     */
+    private static final String WEEK = "week";
+
+    /**
+     * 日
+     */
+    private static final String DAY = "day";
+
+    /**
+     * 时
+     */
+    private static final String HOUR = "hour";
+
+    /**
+     * 分
+     */
+    private static final String MINUTE = "minute";
+
+    /**
+     * 秒
+     */
+    private static final String SECOND = "second";
+
+    /**
+     * 获取当前日期和时间字符串.
+     * @return String 日期时间字符串,例如 2015-08-11 09:51:53
+     */
+    public static String getLocalDateTimeStr() {
+        return format(LocalDateTime.now(), DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取当前日期字符串.
+     * @return String 日期字符串,例如2015-08-11
+     */
+    public static String getLocalDateStr() {
+        return format(LocalDate.now(), DATE_PATTERN);
+    }
+
+    /**
+     * 获取当前时间字符串.
+     * @return String 时间字符串,例如 09:51:53
+     */
+    public static String getLocalTimeStr() {
+        return format(LocalTime.now(), TIME_PATTERN);
+    }
+
+    /**
+     * 获取当前星期字符串.
+     * @return String 当前星期字符串,例如 星期二
+     */
+    public static String getDayOfWeekStr() {
+        return format(LocalDate.now(), "E");
+    }
+
+    /**
+     * 获取指定日期是星期几
+     * @param  localDate 日期
+     * @return           String 星期几
+     */
+    public static String getDayOfWeekStr(LocalDate localDate) {
+        String[] weekOfDays = {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
+        int dayOfWeek = localDate.getDayOfWeek().getValue() - 1;
+        return weekOfDays[dayOfWeek];
+    }
+
+    /**
+     * 获取日期时间字符串
+     * @param  temporal 需要转化的日期时间
+     * @param  pattern  时间格式
+     * @return          String 日期时间字符串,例如 2015-08-11 09:51:53
+     */
+    public static String format(TemporalAccessor temporal, String pattern) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        return dateTimeFormatter.format(temporal);
+    }
+
+    /**
+     * 日期时间字符串转换为日期时间(java.time.LocalDateTime)
+     * @param  localDateTimeStr 日期时间字符串
+     * @param  pattern          日期时间格式 例如DATETIME_PATTERN
+     * @return                  LocalDateTime 日期时间
+     */
+    public static LocalDateTime parseLocalDateTime(String localDateTimeStr, String pattern) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        return LocalDateTime.parse(localDateTimeStr, dateTimeFormatter);
+    }
+
+    /**
+     * 日期字符串转换为日期(java.time.LocalDate)
+     * @param  localDateStr 日期字符串
+     * @param  pattern      日期格式 例如DATE_PATTERN
+     * @return              LocalDate 日期
+     */
+    public static LocalDate parseLocalDate(String localDateStr, String pattern) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        return LocalDate.parse(localDateStr, dateTimeFormatter);
+    }
+
+    /**
+     * 获取指定日期时间加上指定数量日期时间单位之后的日期时间.
+     * @param  localDateTime 日期时间
+     * @param  num           数量
+     * @param  chronoUnit    日期时间单位
+     * @return               LocalDateTime 新的日期时间
+     */
+    public static LocalDateTime plus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
+        return localDateTime.plus(num, chronoUnit);
+    }
+
+    /**
+     * 获取指定日期时间减去指定数量日期时间单位之后的日期时间.
+     * @param  localDateTime 日期时间
+     * @param  num           数量
+     * @param  chronoUnit    日期时间单位
+     * @return               LocalDateTime 新的日期时间
+     */
+    public static LocalDateTime minus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
+        return localDateTime.minus(num, chronoUnit);
+    }
+
+    /**
+     * 根据ChronoUnit计算两个日期时间之间相隔日期时间
+     * @param  start      开始日期时间
+     * @param  end        结束日期时间
+     * @param  chronoUnit 日期时间单位
+     * @return            long 相隔日期时间
+     */
+    public static long getChronoUnitBetween(LocalDateTime start, LocalDateTime end, ChronoUnit chronoUnit) {
+        return Math.abs(start.until(end, chronoUnit));
+    }
+
+    /**
+     * 根据ChronoUnit计算两个日期之间相隔年数或月数或天数
+     * @param  start      开始日期
+     * @param  end        结束日期
+     * @param  chronoUnit 日期时间单位,(ChronoUnit.YEARS,ChronoUnit.MONTHS,ChronoUnit.WEEKS,ChronoUnit.DAYS)
+     * @return            long 相隔年数或月数或天数
+     */
+    public static long getChronoUnitBetween(LocalDate start, LocalDate end, ChronoUnit chronoUnit) {
+        return Math.abs(start.until(end, chronoUnit));
+    }
+
+    /**
+     * 获取本年第一天的日期字符串
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfYearStr() {
+        return getFirstDayOfYearStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取本年最后一天的日期字符串
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfYearStr() {
+        return getLastDayOfYearStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取指定日期当年第一天的日期字符串
+     * @param  localDateTime 指定日期时间
+     * @return               String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfYearStr(LocalDateTime localDateTime) {
+        return getFirstDayOfYearStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当年最后一天的日期字符串
+     * @param  localDateTime 指定日期时间
+     * @return               String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfYearStr(LocalDateTime localDateTime) {
+        return getLastDayOfYearStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当年第一天的日期字符串,带日期格式化参数
+     * @param  localDateTime 指定日期时间
+     * @param  pattern       日期时间格式
+     * @return               String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfYearStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.withDayOfYear(1).withHour(0).withMinute(0).withSecond(0), pattern);
+    }
+
+    /**
+     * 获取指定日期当年最后一天的日期字符串,带日期格式化参数
+     * @param  localDateTime 指定日期时间
+     * @param  pattern       日期时间格式
+     * @return               String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfYearStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.with(TemporalAdjusters.lastDayOfYear()).withHour(23).withMinute(59).withSecond(59), pattern);
+    }
+
+    /**
+     * 获取本月第一天的日期字符串
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfMonthStr() {
+        return getFirstDayOfMonthStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取本月最后一天的日期字符串
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfMonthStr() {
+        return getLastDayOfMonthStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取指定日期当月第一天的日期字符串
+     * @param  localDateTime 指定日期时间
+     * @return               String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getFirstDayOfMonthStr(LocalDateTime localDateTime) {
+        return getFirstDayOfMonthStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当月最后一天的日期字符串
+     * @param  localDateTime 指定日期时间
+     * @return               String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfMonthStr(LocalDateTime localDateTime) {
+        return getLastDayOfMonthStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当月第一天的日期字符串,带日期格式化参数
+     * @param  localDateTime 指定日期时间
+     * @return               String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0), pattern);
+    }
+
+    /**
+     * 获取指定日期当月最后一天的日期字符串,带日期格式化参数
+     * @param  localDateTime 指定日期时间
+     * @param  pattern       日期时间格式
+     * @return               String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59), pattern);
+    }
+
+    /**
+     * 获取本周第一天的日期字符串
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfWeekStr() {
+        return getFirstDayOfWeekStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取本周最后一天的日期字符串
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfWeekStr() {
+        return getLastDayOfWeekStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取指定日期当周第一天的日期字符串,这里第一天为周一
+     * @param  localDateTime 指定日期时间
+     * @return               String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfWeekStr(LocalDateTime localDateTime) {
+        return getFirstDayOfWeekStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日
+     * @param  localDateTime 指定日期时间
+     * @return               String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfWeekStr(LocalDateTime localDateTime) {
+        return getLastDayOfWeekStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当周第一天的日期字符串,这里第一天为周一,带日期格式化参数
+     * @param  localDateTime 指定日期时间
+     * @param  pattern       日期时间格式
+     * @return               String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0), pattern);
+    }
+
+    /**
+     * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日,带日期格式化参数
+     * @param  localDateTime 指定日期时间
+     * @param  pattern       日期时间格式
+     * @return               String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.with(DayOfWeek.SUNDAY).withHour(23).withMinute(59).withSecond(59), pattern);
+    }
+
+    /**
+     * 获取今天开始时间的日期字符串
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getStartTimeOfDayStr() {
+        return getStartTimeOfDayStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取今天结束时间的日期字符串
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getEndTimeOfDayStr() {
+        return getEndTimeOfDayStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取指定日期开始时间的日期字符串
+     * @param  localDateTime 指定日期时间
+     * @return               String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getStartTimeOfDayStr(LocalDateTime localDateTime) {
+        return getStartTimeOfDayStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期结束时间的日期字符串
+     * @param  localDateTime 指定日期时间
+     * @return               String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getEndTimeOfDayStr(LocalDateTime localDateTime) {
+        return getEndTimeOfDayStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期开始时间的日期字符串,带日期格式化参数
+     * @param  localDateTime 指定日期时间
+     * @param  pattern       日期时间格式
+     * @return               String 格式:yyyy-MM-dd HH:mm:ss
+     */
+    public static String getStartTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.withHour(0).withMinute(0).withSecond(0), pattern);
+    }
+
+    /**
+     * 获取指定日期结束时间的日期字符串,带日期格式化参数
+     * @param  localDateTime 指定日期时间
+     * @param  pattern       日期时间格式
+     * @return               String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getEndTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.withHour(23).withMinute(59).withSecond(59), pattern);
+    }
+
+    /**
+     * 切割日期。按照周期切割成小段日期段。例如: <br>
+     * @param  startDate 开始日期(yyyy-MM-dd)
+     * @param  endDate   结束日期(yyyy-MM-dd)
+     * @param  period    周期(天,周,月,年)
+     * @return           切割之后的日期集合
+     *                   <li>startDate="2019-02-28",endDate="2019-03-05",period="day"</li>
+     *                   <li>结果为:[2019-02-28, 2019-03-01, 2019-03-02, 2019-03-03, 2019-03-04, 2019-03-05]</li><br>
+     *                   <li>startDate="2019-02-28",endDate="2019-03-25",period="week"</li>
+     *                   <li>结果为:[2019-02-28,2019-03-06, 2019-03-07,2019-03-13, 2019-03-14,2019-03-20,
+     *                   2019-03-21,2019-03-25]</li><br>
+     *                   <li>startDate="2019-02-28",endDate="2019-05-25",period="month"</li>
+     *                   <li>结果为:[2019-02-28,2019-02-28, 2019-03-01,2019-03-31, 2019-04-01,2019-04-30,
+     *                   2019-05-01,2019-05-25]</li><br>
+     *                   <li>startDate="2019-02-28",endDate="2020-05-25",period="year"</li>
+     *                   <li>结果为:[2019-02-28,2019-12-31, 2020-01-01,2020-05-25]</li><br>
+     */
+    public static List<String> listDateStrs(String startDate, String endDate, String period) {
+        List<String> result = new ArrayList<>();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN);
+        LocalDate end = LocalDate.parse(endDate, dateTimeFormatter);
+        LocalDate start = LocalDate.parse(startDate, dateTimeFormatter);
+        LocalDate tmp = start;
+        switch (period) {
+            case DAY:
+                while (start.isBefore(end) || start.isEqual(end)) {
+                    result.add(start.toString());
+                    start = start.plusDays(1);
+                }
+                break;
+            case WEEK:
+                while (tmp.isBefore(end) || tmp.isEqual(end)) {
+                    if (tmp.plusDays(6).isAfter(end)) {
+                        result.add(tmp.toString() + "," + end);
+                    } else {
+                        result.add(tmp.toString() + "," + tmp.plusDays(6));
+                    }
+                    tmp = tmp.plusDays(7);
+                }
+                break;
+            case MONTH:
+                while (tmp.isBefore(end) || tmp.isEqual(end)) {
+                    LocalDate lastDayOfMonth = tmp.with(TemporalAdjusters.lastDayOfMonth());
+                    if (lastDayOfMonth.isAfter(end)) {
+                        result.add(tmp.toString() + "," + end);
+                    } else {
+                        result.add(tmp.toString() + "," + lastDayOfMonth);
+                    }
+                    tmp = lastDayOfMonth.plusDays(1);
+                }
+                break;
+            case YEAR:
+                while (tmp.isBefore(end) || tmp.isEqual(end)) {
+                    LocalDate lastDayOfYear = tmp.with(TemporalAdjusters.lastDayOfYear());
+                    if (lastDayOfYear.isAfter(end)) {
+                        result.add(tmp.toString() + "," + end);
+                    } else {
+                        result.add(tmp.toString() + "," + lastDayOfYear);
+                    }
+                    tmp = lastDayOfYear.plusDays(1);
+                }
+                break;
+            default:
+                break;
+        }
+        return result;
+    }
+
+    public static void main(String[] args) {
+        System.out.println(getLocalDateTimeStr());
+        System.out.println(getLocalDateStr());
+        System.out.println(getLocalTimeStr());
+        System.out.println(getDayOfWeekStr());
+        System.out.println(getDayOfWeekStr(LocalDate.now()));
+
+        System.out.println("========");
+        System.out.println(format(LocalDate.now(), UNSIGNED_DATE_PATTERN));
+
+        System.out.println("========");
+        System.out.println(parseLocalDateTime("2020-12-13 11:14:12", DATETIME_PATTERN));
+        System.out.println(parseLocalDate("2020-12-13", DATE_PATTERN));
+//
+//        System.out.println("========");
+//        System.out.println(plus(LocalDateTime.now(), 3, ChronoUnit.HOURS));
+        System.out.println(format(minus(LocalDateTime.now(), 90, ChronoUnit.DAYS), DATETIME_PATTERN));
+        System.out.println(format(LocalDate.now(), UNSIGNED_DATE_PATTERN));
+//        System.out.println("========");
+//        System.out.println(getChronoUnitBetween(LocalDateTime.now(), parseLocalDateTime("2020-12-12 12:03:12", DATETIME_PATTERN), ChronoUnit.MINUTES));
+//        System.out.println(getChronoUnitBetween(LocalDate.now(), parseLocalDate("2021-12-12", DATE_PATTERN), ChronoUnit.WEEKS));
+//
+//        System.out.println("========");
+//        System.out.println(getFirstDayOfYearStr());
+//        System.out.println(getFirstDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
+//        System.out.println(getFirstDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
+//
+//        System.out.println(getLastDayOfYearStr());
+//        System.out.println(getLastDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
+//        System.out.println(getLastDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
+//
+//        System.out.println("========");
+//        System.out.println(getFirstDayOfMonthStr());
+//        System.out.println(getFirstDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
+//        System.out.println(getFirstDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
+//
+//        System.out.println(getLastDayOfMonthStr());
+//        System.out.println(getLastDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
+//        System.out.println(getLastDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
+//
+//        System.out.println("========");
+//        System.out.println(getFirstDayOfWeekStr());
+//        System.out.println(getFirstDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
+//        System.out.println(getFirstDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
+//
+//        System.out.println(getLastDayOfWeekStr());
+//        System.out.println(getLastDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
+//        System.out.println(getLastDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
+//
+//        System.out.println("========");
+//        System.out.println(getStartTimeOfDayStr());
+//        System.out.println(getStartTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
+//        System.out.println(getStartTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
+//
+//        System.out.println(getEndTimeOfDayStr());
+//        System.out.println(getEndTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
+//        System.out.println(getEndTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
+//
+//        System.out.println("========");
+//        List<String> dateStrs = listDateStrs("2019-01-30", "2020-12-13", YEAR);
+//        for (String dateStr : dateStrs) {
+//            System.out.println(dateStr);
+//        }
+//
+//        System.out.println("========");
+//        List<String> dateStrs1 = listDateStrs("2019-01-30", "2020-12-13", MONTH);
+//        for (String dateStr : dateStrs1) {
+//            System.out.println(dateStr);
+//        }
+//
+//        System.out.println("========");
+//        List<String> dateStrs2 = listDateStrs("2020-12-01", "2020-12-13", DAY);
+//        for (String dateStr : dateStrs2) {
+//            System.out.println(dateStr);
+//        }
+    }
+
+}