| | |
| | | import lombok.AccessLevel; |
| | | import lombok.NoArgsConstructor; |
| | | import org.apache.commons.lang3.time.DateFormatUtils; |
| | | import org.dromara.common.core.enums.FormatsType; |
| | | import org.dromara.common.core.exception.ServiceException; |
| | | |
| | | import java.lang.management.ManagementFactory; |
| | | import java.text.ParseException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | import java.time.ZoneId; |
| | | import java.time.ZonedDateTime; |
| | | import java.time.*; |
| | | import java.util.Date; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | | * æ¶é´å·¥å
·ç±» |
| | |
| | | */ |
| | | @NoArgsConstructor(access = AccessLevel.PRIVATE) |
| | | public class DateUtils extends org.apache.commons.lang3.time.DateUtils { |
| | | |
| | | public static final String YYYY = "yyyy"; |
| | | |
| | | public static final String YYYY_MM = "yyyy-MM"; |
| | | |
| | | public static final String YYYY_MM_DD = "yyyy-MM-dd"; |
| | | |
| | | public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; |
| | | |
| | | public static final 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() å½åæ¥æ |
| | | * @return å½åæ¥æåæ¶é´ç Date 对象表示 |
| | | */ |
| | | public static Date getNowDate() { |
| | | return new Date(); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åæ¥æ, é»è®¤æ ¼å¼ä¸ºyyyy-MM-dd |
| | | * è·åå½åæ¥æçåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸ºYYYY-MM-DD |
| | | * |
| | | * @return String |
| | | * @return å½åæ¥æçå符串表示 |
| | | */ |
| | | public static String getDate() { |
| | | return dateTimeNow(YYYY_MM_DD); |
| | | return dateTimeNow(FormatsType.YYYY_MM_DD); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åæ¥æçåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸ºyyyyMMdd |
| | | * |
| | | * @return å½åæ¥æçå符串表示 |
| | | */ |
| | | public static String getCurrentDate() { |
| | | return DateFormatUtils.format(new Date(), FormatsType.YYYYMMDD.getTimeFormat()); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åæ¥æçè·¯å¾æ ¼å¼åç¬¦ä¸²ï¼æ ¼å¼ä¸º"yyyy/MM/dd" |
| | | * |
| | | * @return å½åæ¥æçè·¯å¾æ ¼å¼å符串 |
| | | */ |
| | | public static String datePath() { |
| | | Date now = new Date(); |
| | | return DateFormatUtils.format(now, FormatsType.YYYY_MM_DD_SLASH.getTimeFormat()); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åæ¶é´çåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸ºYYYY-MM-DD HH:MM:SS |
| | | * |
| | | * @return å½åæ¶é´çå符串表示 |
| | | */ |
| | | public static String getTime() { |
| | | return dateTimeNow(YYYY_MM_DD_HH_MM_SS); |
| | | return dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åæ¶é´çåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸º "HH:MM:SS" |
| | | * |
| | | * @return å½åæ¶é´çåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸º "HH:MM:SS" |
| | | */ |
| | | public static String getTimeWithHourMinuteSecond() { |
| | | return dateTimeNow(FormatsType.HH_MM_SS); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åæ¥æåæ¶é´çåç¬¦ä¸²è¡¨ç¤ºï¼æ ¼å¼ä¸ºYYYYMMDDHHMMSS |
| | | * |
| | | * @return å½åæ¥æåæ¶é´çå符串表示 |
| | | */ |
| | | public static String dateTimeNow() { |
| | | return dateTimeNow(YYYYMMDDHHMMSS); |
| | | return dateTimeNow(FormatsType.YYYYMMDDHHMMSS); |
| | | } |
| | | |
| | | public static String dateTimeNow(final String format) { |
| | | /** |
| | | * è·åå½åæ¥æåæ¶é´çæå®æ ¼å¼çå符串表示 |
| | | * |
| | | * @param format æ¥ææ¶é´æ ¼å¼ï¼ä¾å¦"YYYY-MM-DD HH:MM:SS" |
| | | * @return å½åæ¥æåæ¶é´çå符串表示 |
| | | */ |
| | | public static String dateTimeNow(final FormatsType format) { |
| | | return parseDateToStr(format, new Date()); |
| | | } |
| | | |
| | | public static String dateTime(final Date date) { |
| | | return parseDateToStr(YYYY_MM_DD, date); |
| | | /** |
| | | * 尿宿¥ææ ¼å¼å为 YYYY-MM-DD æ ¼å¼çå符串 |
| | | * |
| | | * @param date è¦æ ¼å¼åçæ¥æå¯¹è±¡ |
| | | * @return æ ¼å¼ååçæ¥æå符串 |
| | | */ |
| | | public static String formatDate(final Date date) { |
| | | return parseDateToStr(FormatsType.YYYY_MM_DD, date); |
| | | } |
| | | |
| | | public static String parseDateToStr(final String format, final Date date) { |
| | | return new SimpleDateFormat(format).format(date); |
| | | /** |
| | | * 尿宿¥ææ ¼å¼å为 YYYY-MM-DD HH:MM:SS æ ¼å¼çå符串 |
| | | * |
| | | * @param date è¦æ ¼å¼åçæ¥æå¯¹è±¡ |
| | | * @return æ ¼å¼ååçæ¥ææ¶é´å符串 |
| | | */ |
| | | public static String formatDateTime(final Date date) { |
| | | return parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, date); |
| | | } |
| | | |
| | | public static Date dateTime(final String format, final String ts) { |
| | | /** |
| | | * 尿宿¥ææç
§æå®æ ¼å¼è¿è¡æ ¼å¼å |
| | | * |
| | | * @param format è¦ä½¿ç¨çæ¥ææ¶é´æ ¼å¼ï¼ä¾å¦"YYYY-MM-DD HH:MM:SS" |
| | | * @param date è¦æ ¼å¼åçæ¥æå¯¹è±¡ |
| | | * @return æ ¼å¼ååçæ¥ææ¶é´å符串 |
| | | */ |
| | | public static String parseDateToStr(final FormatsType format, final Date date) { |
| | | return new SimpleDateFormat(format.getTimeFormat()).format(date); |
| | | } |
| | | |
| | | /** |
| | | * 尿宿 ¼å¼çæ¥ææ¶é´å符串转æ¢ä¸º Date 对象 |
| | | * |
| | | * @param format è¦è§£æçæ¥ææ¶é´æ ¼å¼ï¼ä¾å¦"YYYY-MM-DD HH:MM:SS" |
| | | * @param ts è¦è§£æçæ¥ææ¶é´å符串 |
| | | * @return è§£æåç Date 对象 |
| | | * @throws RuntimeException å¦æè§£æè¿ç¨ä¸åçå¼å¸¸ |
| | | */ |
| | | public static Date parseDateTime(final FormatsType format, final String ts) { |
| | | try { |
| | | return new SimpleDateFormat(format).parse(ts); |
| | | return new SimpleDateFormat(format.getTimeFormat()).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"); |
| | | } |
| | | |
| | | /** |
| | | * æ¥æåå符串转åä¸ºæ¥æ æ ¼å¼ |
| | | * å°å¯¹è±¡è½¬æ¢ä¸ºæ¥æå¯¹è±¡ |
| | | * |
| | | * @param str è¦è½¬æ¢ç对象ï¼é常æ¯å符串 |
| | | * @return 转æ¢åçæ¥æå¯¹è±¡ï¼å¦æè½¬æ¢å¤±è´¥æè¾å
¥ä¸ºnullï¼åè¿ånull |
| | | */ |
| | | public static Date parseDate(Object str) { |
| | | if (str == null) { |
| | |
| | | |
| | | /** |
| | | * è·åæå¡å¨å¯å¨æ¶é´ |
| | | * |
| | | * @return æå¡å¨å¯å¨æ¶é´ç Date 对象表示 |
| | | */ |
| | | public static Date getServerStartDate() { |
| | | long time = ManagementFactory.getRuntimeMXBean().getStartTime(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 计ç®ç¸å·®å¤©æ° |
| | | * 计ç®ä¸¤ä¸ªæ¥æä¹é´ç天æ°å·®ï¼ä»¥æ¯«ç§ä¸ºåä½ï¼ |
| | | * |
| | | * @param date1 第ä¸ä¸ªæ¥æ |
| | | * @param date2 第äºä¸ªæ¥æ |
| | | * @return ä¸¤ä¸ªæ¥æä¹é´ç天æ°å·®çç»å¯¹å¼ |
| | | */ |
| | | public static int differentDaysByMillisecond(Date date1, Date date2) { |
| | | return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); |
| | | } |
| | | |
| | | /** |
| | | * 计ç®ä¸¤ä¸ªæ¶é´å·® |
| | | * 计ç®ä¸¤ä¸ªæ¥æä¹é´çæ¶é´å·®ï¼å¹¶ä»¥å¤©ãå°æ¶ååéçæ ¼å¼è¿å |
| | | * |
| | | * @param endDate ç»ææ¥æ |
| | | * @param nowDate å½åæ¥æ |
| | | * @return 表示æ¶é´å·®çåç¬¦ä¸²ï¼æ ¼å¼ä¸º"天 å°æ¶ åé" |
| | | */ |
| | | 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 + "åé"; |
| | | long diffInMillis = endDate.getTime() - nowDate.getTime(); |
| | | long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); |
| | | long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; |
| | | long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; |
| | | return String.format("%d天 %då°æ¶ %dåé", day, hour, min); |
| | | } |
| | | |
| | | /** |
| | | * å¢å LocalDateTime ==> Date |
| | | * 计ç®ä¸¤ä¸ªæ¶é´ç¹çå·®å¼ï¼å¤©ãå°æ¶ãåéãç§ï¼ï¼å½å¼ä¸º0æ¶ä¸æ¾ç¤ºè¯¥åä½ |
| | | * |
| | | * @param endDate ç»ææ¶é´ |
| | | * @param nowDate å½åæ¶é´ |
| | | * @return æ¶é´å·®åç¬¦ä¸²ï¼æ ¼å¼ä¸º "x天 xå°æ¶ xåé xç§"ï¼è¥ä¸º 0 å䏿¾ç¤º |
| | | */ |
| | | public static String getTimeDifference(Date endDate, Date nowDate) { |
| | | long diffInMillis = endDate.getTime() - nowDate.getTime(); |
| | | long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); |
| | | long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; |
| | | long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; |
| | | long sec = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60; |
| | | // æå»ºæ¶é´å·®åç¬¦ä¸²ï¼æ¡ä»¶æ¯å¼ä¸ä¸º0ææ¾ç¤º |
| | | StringBuilder result = new StringBuilder(); |
| | | if (day > 0) { |
| | | result.append(String.format("%d天 ", day)); |
| | | } |
| | | if (hour > 0) { |
| | | result.append(String.format("%då°æ¶ ", hour)); |
| | | } |
| | | if (min > 0) { |
| | | result.append(String.format("%dåé ", min)); |
| | | } |
| | | if (sec > 0) { |
| | | result.append(String.format("%dç§", sec)); |
| | | } |
| | | return result.length() > 0 ? result.toString().trim() : "0ç§"; |
| | | } |
| | | |
| | | /** |
| | | * å° LocalDateTime 对象转æ¢ä¸º Date 对象 |
| | | * |
| | | * @param temporalAccessor è¦è½¬æ¢ç LocalDateTime 对象 |
| | | * @return 转æ¢åç Date 对象 |
| | | */ |
| | | public static Date toDate(LocalDateTime temporalAccessor) { |
| | | ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); |
| | |
| | | } |
| | | |
| | | /** |
| | | * å¢å LocalDate ==> Date |
| | | * å° LocalDate 对象转æ¢ä¸º Date 对象 |
| | | * |
| | | * @param temporalAccessor è¦è½¬æ¢ç LocalDate 对象 |
| | | * @return 转æ¢åç Date 对象 |
| | | */ |
| | | public static Date toDate(LocalDate temporalAccessor) { |
| | | LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); |
| | | ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); |
| | | return Date.from(zdt.toInstant()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªæ¥æèå´ |
| | | * |
| | | * @param startDate å¼å§æ¥æ |
| | | * @param endDate ç»ææ¥æ |
| | | * @param maxValue æå¤§æ¶é´è·¨åº¦çéå¶å¼ |
| | | * @param unit æ¶é´è·¨åº¦çåä½ï¼å¯éæ© "DAYS"ã"HOURS" æ "MINUTES" |
| | | */ |
| | | public static void validateDateRange(Date startDate, Date endDate, int maxValue, TimeUnit unit) { |
| | | // æ ¡éªç»ææ¥æä¸è½æ©äºå¼å§æ¥æ |
| | | if (endDate.before(startDate)) { |
| | | throw new ServiceException("ç»ææ¥æä¸è½æ©äºå¼å§æ¥æ"); |
| | | } |
| | | |
| | | // è®¡ç®æ¶é´è·¨åº¦ |
| | | long diffInMillis = endDate.getTime() - startDate.getTime(); |
| | | |
| | | // æ ¹æ®åä½è½¬æ¢æ¶é´è·¨åº¦ |
| | | long diff = switch (unit) { |
| | | case DAYS -> TimeUnit.MILLISECONDS.toDays(diffInMillis); |
| | | case HOURS -> TimeUnit.MILLISECONDS.toHours(diffInMillis); |
| | | case MINUTES -> TimeUnit.MILLISECONDS.toMinutes(diffInMillis); |
| | | default -> throw new IllegalArgumentException("䏿¯æçæ¶é´åä½"); |
| | | }; |
| | | |
| | | // æ ¡éªæ¶é´è·¨åº¦ä¸è¶
è¿æå¤§éå¶ |
| | | if (diff > maxValue) { |
| | | throw new ServiceException("æå¤§æ¶é´è·¨åº¦ä¸º " + maxValue + " " + unit.toString().toLowerCase()); |
| | | } |
| | | } |
| | | |
| | | } |