From 80662b34fe93b4ede00c7fc03fbd9f01355c94e2 Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期一, 07 四月 2025 13:52:17 +0800 Subject: [PATCH] 修改任务接口 --- common/src/main/java/com/ycl/common/utils/DateUtils.java | 131 ++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 126 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/com/ycl/common/utils/DateUtils.java b/common/src/main/java/com/ycl/common/utils/DateUtils.java index b600bc6..e6de789 100644 --- a/common/src/main/java/com/ycl/common/utils/DateUtils.java +++ b/common/src/main/java/com/ycl/common/utils/DateUtils.java @@ -1,15 +1,17 @@ package com.ycl.common.utils; import java.lang.management.ManagementFactory; +import java.sql.Timestamp; 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.HashSet; +import java.util.Objects; +import java.util.Set; + import org.apache.commons.lang3.time.DateFormatUtils; +import org.springframework.lang.Nullable; /** * 鏃堕棿宸ュ叿绫� @@ -32,6 +34,94 @@ "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 String isHoliday = "1-1,1-28,1-29,1-30,1-31,2-1,2-2,2-3,2-4," + +"4-4,4-5,4-6,5-1,5-2,5-3,5-4,5-5,5-31,6-1,6-2,10-1,10-2,10-3," + +"10-4,10-5,10-6,10-7,10-8"; + + /** + * 鑾峰彇涓や釜鏃堕棿鍐咃紝闄ゅ幓鍛ㄦ湯鍛ㄦ棩浠ュ強娉曞畾鑺傚亣鏃ョ殑 灏忔椂鎬绘暟銆� + * @param startDate + * @param endDate + * @return + */ + public static long getWorkingHours(Date startDate,Date endDate){ + + long workingHours = 0; + //杞崲鏃ユ湡鏍煎紡 + LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime endTime = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + if(startTime.isAfter(endTime)){ + throw new RuntimeException("寮�濮嬫椂闂翠笉鑳芥櫄浜庣粨鏉熸椂闂�"); + } + LocalDateTime varTime = startTime; + //鑺傚亣鏃ユ棩鏈�(2025涓哄垪) + Set<LocalDate> holidays = new HashSet<>(); + String[] holiday = isHoliday.split(","); + for (String str : holiday) { + String[] md = str.split("-"); + int month = Integer.parseInt(md[0]); + int day = Integer.parseInt(md[1]); + holidays.add(LocalDate.of(2025,month,day)); + } + while (varTime.isBefore(endTime)){ + boolean isWorkDay = varTime.getDayOfWeek().getValue() < 6 + && !holidays.contains(varTime.toLocalDate()); + // 鍒ゆ柇鏄惁鏄伐浣滄棩锛堥潪鍛ㄦ湯 + 闈炶妭鍋囨棩锛� + if (isWorkDay){ + workingHours++; + } + varTime = varTime.plusHours(1); + } + return workingHours; + } + + /** + * 鑾峰彇涓や釜鏃堕棿鍐咃紝闄ゅ幓鍛ㄦ湯鍛ㄦ棩浠ュ強娉曞畾鑺傚亣鏃ョ殑 绉掓�绘暟銆� + * @param startDate + * @param endDate + * @return + */ + public static long getWorkingSed(Date startDate,Date endDate){ + + long workingHours = 0; + long workingMill = 0; + //杞崲鏃ユ湡鏍煎紡 + LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime endTime = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + if(startTime.isAfter(endTime)){ + throw new RuntimeException("寮�濮嬫椂闂翠笉鑳芥櫄浜庣粨鏉熸椂闂�"); + } + LocalDateTime varTime = startTime; + //鑺傚亣鏃ユ棩鏈�(2025涓哄垪) + Set<LocalDate> holidays = new HashSet<>(); + String[] holiday = isHoliday.split(","); + for (String str : holiday) { + String[] md = str.split("-"); + int month = Integer.parseInt(md[0]); + int day = Integer.parseInt(md[1]); + holidays.add(LocalDate.of(2025,month,day)); + } + while (varTime.isBefore(endTime)){ + boolean isWorkDay = varTime.getDayOfWeek().getValue() < 6 + && !holidays.contains(varTime.toLocalDate()); + long diffMill = endTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() - varTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + // 鍒ゆ柇鏄惁鏄伐浣滄棩锛堥潪鍛ㄦ湯 + 闈炶妭鍋囨棩锛� + if (isWorkDay){ + if (diffMill < 3600000) { + // 濡傛灉涓や釜鏃堕棿涓嶅埌涓�灏忔椂宸窛 + workingMill += diffMill; + break; + } + workingHours++; + workingMill += 3600000; + } + + varTime = varTime.plusHours(1); + } + return workingMill / 1000; + } + /** * 鑾峰彇褰撳墠Date鍨嬫棩鏈� @@ -188,4 +278,35 @@ ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } + + /** + * 鑾峰彇鏌愬ぉ鐨勫紑濮嬫椂闂� + * + * @param date + * @return 2023-01-01 00:00:00 + */ + + public static Date getDayStart(@Nullable Date date) { + if (Objects.isNull(date)) { + date = new Date(); + } + LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.of("GMT+8")); + LocalDateTime of = LocalDateTime.of(localDateTime.getYear(), localDateTime.getMonth(), localDateTime.getDayOfMonth(), 0, 0, 0); + return Timestamp.valueOf(of); + } + + /** + * 鑾峰彇鏌愬ぉ鐨勭粨鏉熸椂闂� + * + * @param date + * @return 2023-01-01 23:59:59 + */ + public static Date getDayEnd(@Nullable Date date) { + if (Objects.isNull(date)) { + date = new Date(); + } + LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); + LocalDateTime of = LocalDateTime.of(localDateTime.getYear(), localDateTime.getMonth(), localDateTime.getDayOfMonth(), 23, 59, 59); + return Timestamp.valueOf(of); + } } -- Gitblit v1.8.0