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); +// } + } + +}