Ver código fonte

【CHG】统一修改日期时间格式

zhaomn 3 anos atrás
pai
commit
95e9d45b2a

+ 12 - 4
railway-common/src/main/java/com/railway/common/core/controller/BaseController.java

@@ -8,12 +8,13 @@ import com.railway.common.core.domain.model.LoginUser;
 import com.railway.common.core.page.PageDomain;
 import com.railway.common.core.page.TableDataInfo;
 import com.railway.common.core.page.TableSupport;
-import com.railway.common.utils.DateUtils;
+import com.railway.common.utils.LocalDateUtil;
 import com.railway.common.utils.SecurityUtils;
 import com.railway.common.utils.StringUtils;
 import com.railway.common.utils.sql.SqlUtil;
 import java.beans.PropertyEditorSupport;
-import java.util.Date;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.WebDataBinder;
@@ -35,10 +36,17 @@ public class BaseController {
   @InitBinder
   public void initBinder(WebDataBinder binder) {
     // Date 类型转换
-    binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
+    binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {
       @Override
       public void setAsText(String text) {
-        setValue(DateUtils.parseDate(text));
+        setValue(LocalDateUtil.convertStringToLocalDateTime(text, LocalDateUtil.DATE_FORMATTER));
+      }
+    });
+
+    binder.registerCustomEditor(LocalDateTime.class, new PropertyEditorSupport() {
+      @Override
+      public void setAsText(String text) {
+        setValue(LocalDateUtil.convertStringToLocalDateTime(text, LocalDateUtil.DATE_TIME_FORMATTER));
       }
     });
   }

+ 4 - 4
railway-common/src/main/java/com/railway/common/core/domain/BaseEntity.java

@@ -1,10 +1,10 @@
 package com.railway.common.core.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import java.io.Serializable;
-import java.util.Date;
+import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.Map;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
@@ -33,7 +33,7 @@ public class BaseEntity implements Serializable {
    */
   @DateTimeFormat(pattern = "yyyy-MM-dd")
   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-  private Date createTime;
+  private LocalDateTime createTime;
 
   /**
    * 更新者
@@ -45,7 +45,7 @@ public class BaseEntity implements Serializable {
    */
   @DateTimeFormat(pattern = "yyyy-MM-dd")
   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-  private Date updateTime;
+  private LocalDateTime updateTime;
 
   /**
    * 备注

+ 5 - 9
railway-common/src/main/java/com/railway/common/core/domain/entity/SysUser.java

@@ -8,7 +8,8 @@ import com.railway.common.annotation.Excels;
 import com.railway.common.core.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import java.util.Date;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 import javax.validation.constraints.Email;
 import javax.validation.constraints.NotBlank;
@@ -139,7 +140,7 @@ public class SysUser extends BaseEntity {
    */
   @ApiModelProperty(value = "出生日期")
   @Excel(name = "出生日期", width = 30, dateFormat = "yyyy-MM-dd", type = Type.EXPORT)
-  private Date birthday;
+  private LocalDate birthday;
 
   /**
    * 用户头像
@@ -155,7 +156,7 @@ public class SysUser extends BaseEntity {
 
   @JsonIgnore
   @DateTimeFormat(pattern = "yyyy-MM-dd")
-  private Date pwdSetDate;
+  private LocalDateTime pwdSetDate;
 
   /**
    * 盐加密
@@ -184,12 +185,7 @@ public class SysUser extends BaseEntity {
    * 最后登录时间
    */
   @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
-  private Date loginDate;
-
-  /**
-   * 密码最后更新时间
-   */
-  private Date pwdUpdateDate;
+  private LocalDateTime loginDate;
 
   /**
    * 部门对象

+ 0 - 183
railway-common/src/main/java/com/railway/common/utils/DateUtils.java

@@ -1,183 +0,0 @@
-package com.railway.common.utils;
-
-import java.lang.management.ManagementFactory;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
-import java.util.Date;
-import org.apache.commons.lang3.time.DateFormatUtils;
-
-/**
- * 时间工具类
- *
- * @author railway
- */
-public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
-
-  public static String YYYY = "yyyy";
-
-  public static String YYYY_MM = "yyyy-MM";
-
-  public static String YYYY_MM_DD = "yyyy-MM-dd";
-
-  public static String YYYYMMDD = "yyyy年MM月dd日";
-
-  public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
-
-  public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
-
-  private static final String[] PARSE_PATTERNS = {
-      "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
-      "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
-      "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
-
-  /**
-   * 获取当前Date型日期
-   *
-   * @return Date() 当前日期
-   */
-  public static Date getNowDate() {
-    return new Date();
-  }
-
-  /**
-   * 获取当前日期, 默认格式为yyyy-MM-dd
-   *
-   * @return String
-   */
-  public static String getDate() {
-    return dateTimeNow(YYYY_MM_DD);
-  }
-
-  public static String getTime() {
-    return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
-  }
-
-  public static String dateTimeNow() {
-    return dateTimeNow(YYYYMMDDHHMMSS);
-  }
-
-  public static String dateTimeNow(final String format) {
-    return parseDateToStr(format, new Date());
-  }
-
-  public static String dateTime(final Date date) {
-    return parseDateToStr(YYYY_MM_DD, date);
-  }
-
-  public static String parseDateToStr(final String format, final Date date) {
-    return new SimpleDateFormat(format).format(date);
-  }
-
-  public static String parseCheckDate(final String ts) {
-    Date date = dateTime(YYYY_MM_DD, ts);
-    return new SimpleDateFormat(YYYYMMDD).format(date);
-  }
-
-  public static String parseCheckDate(final Date date) {
-    return new SimpleDateFormat(YYYYMMDD).format(date);
-  }
-
-  public static String parseCheckDate(final LocalDate date) {
-    return date.format(DateTimeFormatter.ofPattern(YYYYMMDD));
-  }
-
-  public static String parseDateToStr(final String srcFormat, final String targetFormat,
-      final String ts) {
-    Date date = dateTime(srcFormat, ts);
-    return new SimpleDateFormat(targetFormat).format(date);
-  }
-
-  public static Date dateTime(final String format, final String ts) {
-    try {
-      return new SimpleDateFormat(format).parse(ts);
-    } catch (ParseException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  /**
-   * 日期路径 即年/月/日 如2018/08/08
-   */
-  public static String datePath() {
-    Date now = new Date();
-    return DateFormatUtils.format(now, "yyyy/MM/dd");
-  }
-
-  /**
-   * 日期路径 即年/月/日 如20180808
-   */
-  public static String dateTime() {
-    Date now = new Date();
-    return DateFormatUtils.format(now, "yyyyMMdd");
-  }
-
-  /**
-   * 日期型字符串转化为日期 格式
-   */
-  public static Date parseDate(Object str) {
-    if (str == null) {
-      return null;
-    }
-    try {
-      return parseDate(str.toString(), PARSE_PATTERNS);
-    } catch (ParseException e) {
-      return null;
-    }
-  }
-
-  public static LocalDateTime parseDateTime(String dateTimeStr) {
-    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
-    return parseDateTime(dateTimeStr, dateTimeFormatter);
-  }
-
-  public static LocalDateTime parseDateTime(String dateTimeStr,
-      DateTimeFormatter dateTimeFormatter) {
-    LocalDateTime datetime;
-    try {
-      datetime = LocalDateTime.parse(dateTimeStr, dateTimeFormatter);
-    } catch (DateTimeParseException e) {
-      return null;
-    }
-    return datetime;
-  }
-
-  /**
-   * 获取服务器启动时间
-   */
-  public static Date getServerStartDate() {
-    long time = ManagementFactory.getRuntimeMXBean().getStartTime();
-    return new Date(time);
-  }
-
-  /**
-   * 计算相差天数
-   */
-  public static int differentDaysByMillisecond(Date date1, Date date2) {
-    return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
-  }
-
-  /**
-   * 计算两个时间差
-   */
-  public static String getDatePoor(Date endDate, Date nowDate) {
-    long nd = 1000 * 24 * 60 * 60;
-    long nh = 1000 * 60 * 60;
-    long nm = 1000 * 60;
-    // long ns = 1000;
-    // 获得两个时间的毫秒时间差异
-    long diff = endDate.getTime() - nowDate.getTime();
-    // 计算差多少天
-    long day = diff / nd;
-    // 计算差多少小时
-    long hour = diff % nd / nh;
-    // 计算差多少分钟
-    long min = diff % nd % nh / nm;
-    // 计算差多少秒//输出结果
-    // long sec = diff % nd % nh % nm / ns;
-    return day + "天" + hour + "小时" + min + "分钟";
-  }
-}

+ 691 - 0
railway-common/src/main/java/com/railway/common/utils/LocalDateUtil.java

@@ -0,0 +1,691 @@
+package com.railway.common.utils;
+
+import java.lang.management.ManagementFactory;
+import java.text.ParseException;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Date;
+import org.apache.commons.lang3.time.DateUtils;
+
+/**
+ * @author zhaomn
+ * @date 2022/7/6
+ */
+public final class LocalDateUtil {
+
+  public static final Long ONE_DAY_MILLISECOND = 86400000L;
+
+  public static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM");
+  public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+  public static final DateTimeFormatter DATE_PATH_FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+  public static final DateTimeFormatter DATE_SHOW_FORMATTER = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
+  public static final DateTimeFormatter DATE_MINUTE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+  public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+  public static final DateTimeFormatter HOUR_MINUTE_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
+  public static final DateTimeFormatter MINUTE_SECOND_FORMATTER = DateTimeFormatter.ofPattern("mm:ss");
+  public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
+  public static final DateTimeFormatter SHORT_MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM");
+  public static final DateTimeFormatter SHORT_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
+  public static final DateTimeFormatter SHORT_DATE_MINUTE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
+  public static final DateTimeFormatter SHORT_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+  public static final DateTimeFormatter SHORT_HOUR_MINUTE_FORMATTER = DateTimeFormatter.ofPattern("HHmm");
+  public static final DateTimeFormatter SHORT_MINUTE_SECOND_FORMATTER = DateTimeFormatter.ofPattern("mmss");
+  public static final DateTimeFormatter SHORT_TIME_FORMATTER = DateTimeFormatter.ofPattern("HHmmss");
+
+  private static final String[] PARSE_PATTERNS = {
+      "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
+      "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
+      "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+
+  private static final long WEEK_DAYS = 7L;
+
+  private LocalDateUtil() {
+  }
+
+  //==============================Date To String==============================
+
+  /**
+   * LocalDateTime类型时间转字符串
+   *
+   * @param date 要格式的时间
+   * @param formatter 格式(本类中的静态常量)
+   * @return 格式化后的字符串
+   */
+  public static String convertLocalDateTimeToString(LocalDateTime date, DateTimeFormatter formatter) {
+    if (date == null || formatter == null) {
+      return null;
+    }
+    return date.format(formatter);
+  }
+
+  /**
+   * LocalDate类型时间转字符串
+   *
+   * @param date 要格式的时间
+   * @param formatter 格式(本类中的静态常量)
+   * @return 格式化后的字符串
+   */
+  public static String convertLocalDateToString(LocalDate date, DateTimeFormatter formatter) {
+    if (date == null || formatter == null) {
+      return null;
+    }
+    return date.format(formatter);
+  }
+
+  /**
+   * LocalDate类型时间转字符串
+   *
+   * @param date 要格式的时间
+   * @return 格式化后的字符串
+   */
+  public static String convertLocalDateToShow(LocalDate date) {
+    return date.format(DATE_SHOW_FORMATTER);
+  }
+
+  /**
+   * 时间戳(毫秒)类型时间转字符串
+   *
+   * @param date 要格式的时间
+   * @param formatter 格式(本类中的静态常量)
+   * @return 格式化后的字符串
+   */
+  public static String convertTimestampToString(Long date, DateTimeFormatter formatter) {
+    return convertLocalDateTimeToString(convertToLocalDateTime(date), formatter);
+  }
+
+  //==============================String To Date==============================
+
+  /**
+   * 字符串转LocalDateTime类型
+   *
+   * @param date 要格式化的字符串
+   * @param formatter 格式(本类中的静态常量)
+   * @return LocalDateTime类型时间
+   */
+  public static LocalDateTime convertStringToLocalDateTime(String date,
+      DateTimeFormatter formatter) {
+    if (date == null || formatter == null) {
+      return null;
+    }
+    if (MONTH_FORMATTER.equals(formatter) || DATE_FORMATTER.equals(formatter)
+        || SHORT_MONTH_FORMATTER.equals(formatter) || SHORT_DATE_FORMATTER.equals(formatter)) {
+      return LocalDateTime.of(LocalDate.parse(date, formatter), LocalTime.MIN);
+    }
+    if (HOUR_MINUTE_FORMATTER.equals(formatter) || TIME_FORMATTER.equals(formatter)
+        || MINUTE_SECOND_FORMATTER.equals(formatter) || SHORT_HOUR_MINUTE_FORMATTER.equals(
+        formatter)
+        || SHORT_TIME_FORMATTER.equals(formatter) || SHORT_MINUTE_SECOND_FORMATTER.equals(
+        formatter)) {
+      return LocalDateTime.of(LocalDate.MIN, LocalTime.parse(date, formatter));
+    }
+    return LocalDateTime.parse(date, formatter);
+  }
+
+  /**
+   * LocalDateTime类型时间转字符串
+   *
+   * @param date 要格式的时间
+   * @param format 格式(本类中的静态常量)
+   * @return 格式化后的字符串
+   */
+  public static String convertLocalDateTimeToString(String date, String format) {
+    if (date == null || format == null) {
+      return null;
+    }
+    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
+    LocalDateTime dateTime = convertStringToLocalDateTime(date, DATE_TIME_FORMATTER);
+    return dateTime.format(formatter);
+  }
+
+  /**
+   * 字符串转时间戳(毫秒)类型
+   *
+   * @param date 要格式化的字符串
+   * @param formatter 格式(本类中的静态常量)
+   * @return 时间戳(秒)类型时间
+   */
+  public static Long convertStringToTimestamp(String date, DateTimeFormatter formatter) {
+    return convertToTimestamp(convertStringToLocalDateTime(date, formatter));
+  }
+
+  //==============================Timestamp To Other==============================
+
+  /**
+   * 时间戳(毫秒)类型转LocalDateTime
+   *
+   * @param date 时间戳(毫秒)
+   * @return LocalDateTime类型时间
+   */
+  public static LocalDateTime convertToLocalDateTime(Long date) {
+    return date == null ? null
+        : LocalDateTime.ofInstant(Instant.ofEpochMilli(date), ZoneId.systemDefault());
+  }
+
+  //==============================LocalDateTime To Other==============================
+
+  /**
+   * LocalDateTime类型转时间戳(毫秒)
+   *
+   * @param date LocalDateTime类型时间
+   * @return 时间戳(秒)类型时间
+   */
+  public static Long convertToTimestamp(LocalDateTime date) {
+    return date == null ? null : date.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+  }
+
+  //==============================Day Start==============================
+
+  /**
+   * 获取给定LocalDateTime类型时间0点0分0秒
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间0点0分0秒
+   */
+  public static LocalDateTime getDayStartLocalDateTime(LocalDateTime date) {
+    return date == null ? null
+        : LocalDateTime.of(LocalDate.of(date.getYear(), date.getMonth(), date.getDayOfMonth()),
+            LocalTime.MIN);
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间0点0分0秒
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间0点0分0秒
+   */
+  public static LocalDateTime getDayStartLocalDateTime(Long date) {
+    return getDayStartLocalDateTime(convertToLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定LocalDateTime类型时间0点0分0秒
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间0点0分0秒
+   */
+  public static Long getDayStartTimestamp(LocalDateTime date) {
+    return convertToTimestamp(getDayStartLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间0点0分0秒
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间0点0分0秒
+   */
+  public static Long getDayStartTimestamp(Long date) {
+    return convertToTimestamp(getDayStartLocalDateTime(date));
+  }
+
+  //==============================Next Day Start==============================
+
+  /**
+   * 获取给定LocalDateTime类型后一天0点0分0秒
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型后一天0点0分0秒
+   */
+  public static LocalDateTime getNextDayStartLocalDateTime(LocalDateTime date) {
+    return date == null ? null : getDayStartLocalDateTime(date.plusDays(1));
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型后一天0点0分0秒
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型后一天0点0分0秒
+   */
+  public static LocalDateTime getNextDayStartLocalDateTime(Long date) {
+    return getNextDayStartLocalDateTime(convertToLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定LocalDateTime类型后一天0点0分0秒
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型后一天0点0分0秒
+   */
+  public static Long getNextDayStartTimestamp(LocalDateTime date) {
+    return convertToTimestamp(getNextDayStartLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型后一天0点0分0秒
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型后一天0点0分0秒
+   */
+  public static Long getNextDayStartTimestamp(Long date) {
+    return convertToTimestamp(getNextDayStartLocalDateTime(date));
+  }
+
+  //==============================Last Day Start==============================
+
+  /**
+   * 获取给定LocalDateTime类型时间前一天0点0分0秒
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间前一天0点0分0秒
+   */
+  public static LocalDateTime getLastDayStartLocalDateTime(LocalDateTime date) {
+    return date == null ? null : getDayStartLocalDateTime(date.minusDays(1));
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间前一天0点0分0秒
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间前一天0点0分0秒
+   */
+  public static LocalDateTime getLastDayStartLocalDateTime(Long date) {
+    return getLastDayStartLocalDateTime(convertToLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定LocalDateTime类型时间前一天0点0分0秒
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间前一天0点0分0秒
+   */
+  public static Long getLastDayStartTimestamp(LocalDateTime date) {
+    return convertToTimestamp(getLastDayStartLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间前一天0点0分0秒
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间前一天0点0分0秒
+   */
+  public static Long getLastDayStartTimestamp(Long date) {
+    return convertToTimestamp(getLastDayStartLocalDateTime(date));
+  }
+
+  //==============================Days Between Two Time==============================
+
+  /**
+   * 获取两个LocalDateTime类型时间相差天数
+   *
+   * @param startDate 开始时间
+   * @param endDate 结束时间
+   * @return 相差天数
+   */
+  public static int getDaysBetween(LocalDateTime startDate, LocalDateTime endDate) {
+    return getDaysBetween(convertToTimestamp(startDate), convertToTimestamp(endDate));
+  }
+
+  /**
+   * 获取两个时间戳(毫秒)类型时间相差天数
+   *
+   * @param startDate 开始时间
+   * @param endDate 结束时间
+   * @return 相差天数
+   */
+  public static int getDaysBetween(Long startDate, Long endDate) {
+    if (startDate == null || endDate == null) {
+      return Integer.MAX_VALUE;
+    }
+    return (int) ((endDate - startDate) / ONE_DAY_MILLISECOND);
+  }
+
+  /**
+   * 计算两个时间差
+   */
+  public static String getDatePoor(LocalDateTime endDate, LocalDateTime nowDate) {
+    long nd = 1000 * 24 * 60 * 60;
+    long nh = 1000 * 60 * 60;
+    long nm = 1000 * 60;
+    // long ns = 1000;
+    // 获得两个时间的毫秒时间差异
+    long diff = endDate.toInstant(ZoneOffset.of("+8")).toEpochMilli()
+        - nowDate.toInstant(ZoneOffset.of("+8")).toEpochMilli();
+    // 计算差多少天
+    long day = diff / nd;
+    // 计算差多少小时
+    long hour = diff % nd / nh;
+    // 计算差多少分钟
+    long min = diff % nd % nh / nm;
+    // 计算差多少秒//输出结果
+    // long sec = diff % nd % nh % nm / ns;
+    return day + "天" + hour + "小时" + min + "分钟";
+  }
+
+  //==============================First Day Of Month==============================
+
+  /**
+   * 获取给定LocalDateTime类型时间所在月的第一天
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间所在月的第一天
+   */
+  public static LocalDateTime getFirstDayOfMonthLocalDateTime(LocalDateTime date) {
+    return date == null ? null
+        : LocalDateTime.of(date.toLocalDate().with(TemporalAdjusters.firstDayOfMonth()),
+            LocalTime.MIN);
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间所在月的第一天
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 间戳(毫秒)类型时间所在月的第一天
+   */
+  public static LocalDateTime getFirstDayOfMonthLocalDateTime(Long date) {
+    return getFirstDayOfMonthLocalDateTime(convertToLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定LocalDateTime类型时间所在月的第一天
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间所在月的第一天
+   */
+  public static Long getFirstDayOfMonthTimestamp(LocalDateTime date) {
+    return convertToTimestamp(getFirstDayOfMonthLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间所在月的第一天
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 间戳(毫秒)类型时间所在月的第一天
+   */
+  public static Long getFirstDayOfMonthTimestamp(Long date) {
+    return convertToTimestamp(getFirstDayOfMonthLocalDateTime(date));
+  }
+
+  //==============================Last Day Of Month==============================
+
+  /**
+   * 获取给定LocalDateTime类型时间所在月的最后一天
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间所在月的最后一天
+   */
+  public static LocalDateTime getLastDayOfMonthLocalDateTime(LocalDateTime date) {
+    return date == null ? null
+        : LocalDateTime.of(date.toLocalDate().with(TemporalAdjusters.lastDayOfMonth()),
+            LocalTime.MIN);
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间所在月的最后一天
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间所在月的最后一天
+   */
+  public static LocalDateTime getLastDayOfMonthLocalDateTime(Long date) {
+    return getLastDayOfMonthLocalDateTime(convertToLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定LocalDateTime类型时间所在月的最后一天
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间所在月的最后一天
+   */
+  public static Long getLastDayOfMonthTimestamp(LocalDateTime date) {
+    return convertToTimestamp(getLastDayOfMonthLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间所在月的最后一天
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间所在月的最后一天
+   */
+  public static Long getLastDayOfMonthTimestamp(Long date) {
+    return convertToTimestamp(getLastDayOfMonthLocalDateTime(date));
+  }
+
+  //==============================First Day Of Week==============================
+
+  /**
+   * 获取给定LocalDateTime类型时间所在周的第一天
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间所在周的第一天
+   */
+  public static LocalDateTime getFirstDayOfWeekLocalDateTime(LocalDateTime date) {
+    return date == null ? null : date.minusDays(date.getDayOfWeek().getValue() - 1L);
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间所在周的第一天
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间所在周的第一天
+   */
+  public static LocalDateTime getFirstDayOfWeekLocalDateTime(Long date) {
+    return getFirstDayOfWeekLocalDateTime(convertToLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定LocalDateTime类型时间所在周的第一天
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间所在周的第一天
+   */
+  public static Long getFirstDayOfWeekTimestamp(LocalDateTime date) {
+    return convertToTimestamp(getFirstDayOfWeekLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间所在周的第一天
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间所在周的第一天
+   */
+  public static Long getFirstDayOfWeekTimestamp(Long date) {
+    return convertToTimestamp(getFirstDayOfWeekLocalDateTime(date));
+  }
+
+  //==============================Last Day Of Week==============================
+
+  /**
+   * 获取给定LocalDateTime类型时间所在周的最后一天
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间所在周的最后一天
+   */
+  public static LocalDateTime getLastDayOfWeekLocalDateTime(LocalDateTime date) {
+    return date == null ? null : date.plusDays(WEEK_DAYS - date.getDayOfWeek().getValue());
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间所在周的最后一天
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间所在周的最后一天
+   */
+  public static LocalDateTime getLastDayOfWeekLocalDateTime(Long date) {
+    return getLastDayOfWeekLocalDateTime(convertToLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定LocalDateTime类型时间所在周的最后一天
+   *
+   * @param date LocalDateTime类型时间
+   * @return LocalDateTime类型时间所在周的最后一天
+   */
+  public static Long getLastDayOfWeekTimestamp(LocalDateTime date) {
+    return convertToTimestamp(getLastDayOfWeekLocalDateTime(date));
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间所在周的最后一天
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @return 时间戳(毫秒)类型时间所在周的最后一天
+   */
+  public static Long getLastDayOfWeekTimestamp(Long date) {
+    return convertToTimestamp(getLastDayOfWeekLocalDateTime(date));
+  }
+
+  //==============================plus days==============================
+
+  /**
+   * 获取给定LocalDateTime类型时间给定天数后的时间
+   *
+   * @param date LocalDateTime类型时间
+   * @param days 天数
+   * @return LocalDateTime类型时间给定天数后的时间
+   */
+  public static LocalDateTime plusDays(LocalDateTime date, int days) {
+    return date == null ? null : date.plusDays(days);
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间给定天数后的时间
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @param days 天数
+   * @return 时间戳(毫秒)类型时间给定天数后的时间
+   */
+  public static Long plusDays(Long date, int days) {
+    return date == null ? null : date + days * ONE_DAY_MILLISECOND;
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间给定天数后的时间
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @param months 月数
+   * @return 时间戳(毫秒)类型时间给定天数后的时间
+   */
+  public static LocalDate plusMonths(LocalDate date, int months) {
+    return date == null ? null : date.plusMonths(months);
+  }
+
+  //==============================minus days==============================
+
+  /**
+   * 获取给定LocalDateTime类型时间给定天数前的时间
+   *
+   * @param date LocalDateTime类型时间
+   * @param days 天数
+   * @return LocalDateTime类型时间给定天数前的时间
+   */
+  public static LocalDateTime minusDays(LocalDateTime date, int days) {
+    return date == null ? null : date.minusDays(days);
+  }
+
+  /**
+   * 获取给定时间戳(毫秒)类型时间给定天数前的时间
+   *
+   * @param date 时间戳(毫秒)类型时间
+   * @param days 天数
+   * @return 时间戳(毫秒)类型时间给定天数前的时间
+   */
+  public static Long minusDays(Long date, int days) {
+    return date == null ? null : date - days * ONE_DAY_MILLISECOND;
+  }
+
+  //==============================Check Intersection Common==============================
+
+  /**
+   * 公用比较方法
+   *
+   * @param startDate1 开始时间1
+   * @param endDate1 结束时间1
+   * @param startDate2 开始时间2
+   * @param endDate2 结束时间2
+   * @param <T> the type of Comparable
+   * @return 是否有交集
+   */
+  private static <T extends Comparable<T>> boolean checkIntersectionCommon(T startDate1, T endDate1,
+      T startDate2, T endDate2) {
+    if (startDate1 == null || endDate1 == null || startDate2 == null || endDate2 == null) {
+      return false;
+    }
+    return startDate1.compareTo(endDate2) < 0 && startDate2.compareTo(endDate1) < 0;
+  }
+
+  //==============================Check Intersection==============================
+
+  /**
+   * 检查两个LocalDateTime类型时间段是否有交集
+   *
+   * @param startDate1 开始时间1
+   * @param endDate1 结束时间1
+   * @param startDate2 开始时间2
+   * @param endDate2 结束时间2
+   * @return 是否有交集
+   */
+  public static boolean checkIntersection(LocalDateTime startDate1, LocalDateTime endDate1,
+      LocalDateTime startDate2, LocalDateTime endDate2) {
+    return checkIntersectionCommon(startDate1, endDate1, startDate2, endDate2);
+  }
+
+  /**
+   * 检查两个时间段戳(毫秒)类型时间是否有交集
+   *
+   * @param startDate1 开始时间1
+   * @param endDate1 结束时间1
+   * @param startDate2 开始时间2
+   * @param endDate2 结束时间2
+   * @return 是否有交集
+   */
+  public static boolean checkIntersection(Long startDate1, Long endDate1, Long startDate2,
+      Long endDate2) {
+    return checkIntersectionCommon(startDate1, endDate1, startDate2, endDate2);
+  }
+
+  //==============================Now==============================
+
+  /**
+   * 获取系统当前时间字符串类型时间
+   *
+   * @param formatter 格式
+   * @return 系统当前时间字符串
+   */
+  public static String getNow(DateTimeFormatter formatter) {
+    return convertLocalDateTimeToString(LocalDateTime.now(), formatter);
+  }
+
+  /**
+   * 获取系统当前时间字符串类型时间
+   *
+   * @return 系统当前时间字符串
+   */
+  public static String getNow() {
+    return convertLocalDateTimeToString(LocalDateTime.now(), SHORT_DATE_TIME_FORMATTER);
+  }
+
+  /**
+   * 获取系统当前时间戳(毫秒)类型时间
+   *
+   * @return 系统当前时间戳(毫秒)
+   */
+  public static long getNowTimestamp() {
+    return System.currentTimeMillis();
+  }
+
+  /**
+   * 获取服务器启动时间
+   */
+  public static LocalDateTime getServerStartDate() {
+    long time = ManagementFactory.getRuntimeMXBean().getStartTime();
+    return LocalDateTime.ofEpochSecond(time/1000,0, ZoneOffset.ofHours(8));
+  }
+
+  /**
+   * 日期型字符串转化为日期 格式
+   */
+  public static Date parseDate(Object str) {
+    if (str == null) {
+      return null;
+    }
+    try {
+      return DateUtils.parseDate(str.toString(), PARSE_PATTERNS);
+    } catch (ParseException e) {
+      return null;
+    }
+  }
+}

+ 1 - 1
railway-common/src/main/java/com/railway/common/utils/QrCodeUtil.java

@@ -134,7 +134,7 @@ public class QrCodeUtil {
       String toolName = "名称";
       List<String> bottomDes = Arrays.asList("长春西高铁综合车间", "存放处",
           toolName + " - " + "2314321412");
-      encode(qcode, bottomDes, "D:/" + DateUtils.dateTimeNow() + ".jpg");
+      encode(qcode, bottomDes, "D:/" + LocalDateUtil.getNow() + ".jpg");
     } catch (Exception e) {
       e.printStackTrace();
     }

+ 3 - 2
railway-common/src/main/java/com/railway/common/utils/file/FileUploadUtils.java

@@ -5,7 +5,7 @@ import com.railway.common.constant.Constants;
 import com.railway.common.exception.file.FileNameLengthLimitExceededException;
 import com.railway.common.exception.file.FileSizeLimitExceededException;
 import com.railway.common.exception.file.InvalidExtensionException;
-import com.railway.common.utils.DateUtils;
+import com.railway.common.utils.LocalDateUtil;
 import com.railway.common.utils.StringUtils;
 import com.railway.common.utils.uuid.IdUtils;
 import java.io.File;
@@ -109,7 +109,8 @@ public class FileUploadUtils {
     String fileName = file.getOriginalFilename();
     log.info("OriginalFilename : {}", fileName);
     String extension = getExtension(file);
-    fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
+    fileName = LocalDateUtil.getNow(LocalDateUtil.DATE_PATH_FORMATTER)
+        + "/" + IdUtils.fastUUID() + "." + extension;
     return fileName;
   }
 

+ 3 - 2
railway-common/src/main/java/com/railway/common/utils/file/FileUtils.java

@@ -1,6 +1,6 @@
 package com.railway.common.utils.file;
 
-import com.railway.common.utils.DateUtils;
+import com.railway.common.utils.LocalDateUtil;
 import com.railway.common.utils.StringUtils;
 import com.railway.common.utils.uuid.IdUtils;
 import java.io.BufferedWriter;
@@ -91,7 +91,8 @@ public class FileUtils {
     String pathName;
     try {
       String extension = getFileExtendName(data);
-      pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
+      pathName = LocalDateUtil.getNow(LocalDateUtil.DATE_PATH_FORMATTER)
+          + "/" + IdUtils.fastUUID() + "." + extension;
       File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName);
       fos = new FileOutputStream(file);
       fos.write(data);

+ 8 - 6
railway-common/src/main/java/com/railway/common/utils/poi/ExcelUtil.java

@@ -7,20 +7,21 @@ import com.railway.common.annotation.Excels;
 import com.railway.common.constant.Constants;
 import com.railway.common.core.text.Convert;
 import com.railway.common.exception.UtilException;
-import com.railway.common.utils.DateUtils;
 import com.railway.common.utils.DictUtils;
+import com.railway.common.utils.LocalDateUtil;
 import com.railway.common.utils.StringUtils;
 import com.railway.common.utils.file.FileTypeUtils;
 import com.railway.common.utils.file.FileUploadUtils;
 import com.railway.common.utils.file.ImageUtils;
 import com.railway.common.utils.reflect.ReflectUtils;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -279,7 +280,7 @@ public class ExcelUtil<T> {
             } else {
               String dateFormat = field.getAnnotation(Excel.class).dateFormat();
               if (StringUtils.isNotEmpty(dateFormat)) {
-                val = DateUtils.parseDateToStr(dateFormat, (Date) val);
+                val = LocalDateUtil.convertLocalDateTimeToString(String.valueOf(val), dateFormat);
               } else {
                 val = Convert.toStr(val);
               }
@@ -297,7 +298,7 @@ public class ExcelUtil<T> {
             val = Convert.toBigDecimal(val);
           } else if (Date.class == fieldType) {
             if (val instanceof String) {
-              val = DateUtils.parseDate(val);
+              val = LocalDateUtil.parseDate(val);
             } else if (val instanceof Double) {
               val = DateUtil.getJavaDate((Double) val);
             }
@@ -435,7 +436,7 @@ public class ExcelUtil<T> {
       writeSheet();
       String filename = encodingFilename(sheetName);
       String filePath = FileUploadUtils.getAbsoluteFile(filename);
-      out = new FileOutputStream(filePath);
+      out = Files.newOutputStream(Paths.get(filePath));
       wb.write(out);
       return filePath;
     } catch (Exception e) {
@@ -679,7 +680,8 @@ public class ExcelUtil<T> {
         String separator = attr.separator();
         String dictType = attr.dictType();
         if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) {
-          cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value));
+          cell.setCellValue(
+              LocalDateUtil.convertLocalDateTimeToString(String.valueOf(value), dateFormat));
         } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) {
           cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator));
         } else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) {

+ 2 - 2
railway-common/src/main/java/com/railway/common/utils/reflect/ReflectUtils.java

@@ -1,7 +1,7 @@
 package com.railway.common.utils.reflect;
 
 import com.railway.common.core.text.Convert;
-import com.railway.common.utils.DateUtils;
+import com.railway.common.utils.LocalDateUtil;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -153,7 +153,7 @@ public class ReflectUtils {
             args[i] = Convert.toFloat(args[i]);
           } else if (cs[i] == Date.class) {
             if (args[i] instanceof String) {
-              args[i] = DateUtils.parseDate(args[i]);
+              args[i] = LocalDateUtil.parseDate(args[i]);
             } else {
               args[i] = DateUtil.getJavaDate((Double) args[i]);
             }

+ 3 - 2
railway-common/src/main/java/com/railway/common/utils/sign/SignatureUtil.java

@@ -4,7 +4,7 @@ import static com.railway.common.core.domain.dto.ReturnCode.SIGN_CHECK_FAIL;
 
 import com.railway.common.core.domain.AjaxResult;
 import com.railway.common.core.domain.dto.ReturnCode;
-import com.railway.common.utils.DateUtils;
+import com.railway.common.utils.LocalDateUtil;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.security.InvalidKeyException;
@@ -78,7 +78,8 @@ public class SignatureUtil {
           requestId, userTimestamp);
       return AjaxResult.error(ReturnCode.REQUIRED_PARAM_MISSING);
     }
-    LocalDateTime urlDateTime = DateUtils.parseDateTime(userTimestamp);
+    LocalDateTime urlDateTime = LocalDateUtil.convertStringToLocalDateTime(userTimestamp,
+        LocalDateUtil.DATE_TIME_FORMATTER);
     if (null == urlDateTime) {
       log.debug("checkSignature, time format error, requestId {}, timestamp {}",
           requestId, userTimestamp);