From 6e8166012e4e5842cfdecd4d318f8f9ec6ac9f4d Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期一, 31 三月 2025 09:31:58 +0800
Subject: [PATCH] Merge branch 'dev'

---
 common/src/main/java/com/ycl/common/utils/DateUtils.java |   79 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 79 insertions(+), 0 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..3780ccc 100644
--- a/common/src/main/java/com/ycl/common/utils/DateUtils.java
+++ b/common/src/main/java/com/ycl/common/utils/DateUtils.java
@@ -1,6 +1,7 @@
 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;
@@ -9,7 +10,12 @@
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
 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 +38,48 @@
             "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;
+    }
+
 
     /**
      * 鑾峰彇褰撳墠Date鍨嬫棩鏈�
@@ -188,4 +236,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