| package com.zy.asrs.utils; | 
|   | 
| import java.time.DayOfWeek; | 
| import java.time.LocalDate; | 
| import java.time.ZoneId; | 
| import java.time.temporal.ChronoUnit; | 
| import java.time.temporal.TemporalAdjusters; | 
| import java.time.temporal.WeekFields; | 
| import java.util.*; | 
|   | 
| public class TimeCalculatorUtils { | 
|   | 
|   | 
|   | 
|     //获取七天前的日期(日期天数减七) | 
|     public static Date timeFrontSevenYesterday(Date date){ | 
|         Calendar calendar = Calendar.getInstance(); | 
|         calendar.setTime(date); | 
|         calendar.add(Calendar.DAY_OF_MONTH, -7); | 
|         return calendar.getTime(); | 
|     } | 
|   | 
|     //获取七天后的日期(日期天数加七) | 
|     public static Date timeAfterSevenYesterday(Date date){ | 
|         Calendar calendar = Calendar.getInstance(); | 
|         calendar.setTime(date); | 
|         calendar.add(Calendar.DAY_OF_MONTH, 7); | 
|         return calendar.getTime(); | 
|     } | 
|   | 
|     //获取相差n天的日期(日期天数加N) | 
|     public static Date timeYesterdayN(Date date,int day){ | 
|         Calendar calendar = Calendar.getInstance(); | 
|         calendar.setTime(date); | 
|         calendar.add(Calendar.DAY_OF_MONTH, day); | 
|         return calendar.getTime(); | 
|     } | 
|   | 
|     //获取年月日 | 
|     public static String timeYestMonthDay(Date date){ | 
|         Calendar calendar = Calendar.getInstance(); | 
|         calendar.setTime(date); | 
|   | 
|         int year = calendar.get(Calendar.YEAR); | 
|         int month = calendar.get(Calendar.MONTH) + 1;  // 月份从0开始,需要加1 | 
|         int day = calendar.get(Calendar.DAY_OF_MONTH); | 
|         return year+"年"+month+"月"+day+"日"; | 
|     } | 
|   | 
|     //获取年 | 
|     public static int timeYest(Date date){ | 
|         Calendar calendar = Calendar.getInstance(); | 
|         calendar.setTime(date); | 
|   | 
|         return calendar.get(Calendar.YEAR); | 
|     } | 
|   | 
|     //获取月 | 
|     public static int timeMonth(Date date){ | 
|         Calendar calendar = Calendar.getInstance(); | 
|         calendar.setTime(date); | 
|   | 
|         return calendar.get(Calendar.MONTH) + 1; | 
|     } | 
|   | 
|     //获取日 | 
|     public static int timeDay(Date date){ | 
|         Calendar calendar = Calendar.getInstance(); | 
|         calendar.setTime(date); | 
|   | 
|         return calendar.get(Calendar.DAY_OF_MONTH); | 
|     } | 
|     //获取年差异 | 
|     public static int DifferenceYest(Date startDay,Date endDay){ | 
|         int startYest = timeYest(startDay); | 
|         int endYest = timeYest(endDay); | 
|         return endYest-startYest; | 
|     } | 
|     //获取月差异 | 
|     public static int DifferenceMonth(Date startDay,Date endDay){ | 
|         int startMonth = timeMonth(startDay); | 
|         int endMonth = timeMonth(endDay); | 
|         return endMonth-startMonth; | 
|     } | 
|     //获取天差异 | 
|     public static int DifferenceDayInt(Date startDay,Date endDay){ | 
|         return DifferenceDayLong(startDay,endDay).intValue(); | 
|     } | 
|     //获取天差异 | 
|     public static Long DifferenceDayLong(Date startDay,Date endDay){ | 
|   | 
|         LocalDate a = LocalDate.of(timeYest(startDay), timeMonth(startDay), timeDay(startDay)); | 
|         LocalDate b = LocalDate.of(timeYest(endDay), timeMonth(endDay), timeDay(endDay)); | 
|   | 
|         return ChronoUnit.DAYS.between(a, b)+1; | 
|     } | 
|     //获取天差异 | 
|     public static Double DifferenceDayMorningAfternoon(Date startDay,Date endDay,int startTime,int endTime){ | 
|         double between = DifferenceDayLong(startDay, endDay).doubleValue(); | 
|         if (startTime==2){ | 
|             between = between-0.5; | 
|         } | 
|         if (endTime == 1){ | 
|             between = between-0.5; | 
|         } | 
|         return between; | 
|     } | 
|   | 
|     //获取毫秒差异 | 
|     public static Long differenceInMilliseconds(Date startDay, Date endDay) { | 
|         if (startDay == null || endDay == null) { | 
|             throw new IllegalArgumentException("Dates cannot be null"); | 
|         } | 
|   | 
|         // 获取毫秒差异 | 
|         return endDay.getTime() - startDay.getTime(); | 
|     } | 
|   | 
|     //获秒差异 | 
|     public static long differenceInSeconds(Date startDay, Date endDay) { | 
|         if (startDay == null || endDay == null) { | 
|             throw new IllegalArgumentException("Dates cannot be null"); | 
|         } | 
|   | 
|         // 获取毫秒差异,并转换为秒 | 
|         long millisecondsDifference = endDay.getTime() - startDay.getTime(); | 
|         return millisecondsDifference / 1000; | 
|     } | 
|   | 
|     public static boolean CompareData(Date startDay,Date endDay){ | 
|   | 
|         // 将日期字符串解析为LocalDate对象 | 
|         LocalDate a = LocalDate.of(timeYest(startDay), timeMonth(startDay), timeDay(startDay)); | 
|         LocalDate b = LocalDate.of(timeYest(endDay), timeMonth(endDay), timeDay(endDay)); | 
|   | 
|         // 比较日期 | 
|         if (a.isAfter(b)) { | 
|             return false; | 
|         } else if (a.isBefore(b)) { | 
|             return true; | 
|         } else { | 
|             return true; | 
|         } | 
|     } | 
|   | 
|     //java.time.LocalDate 转换为 java.util.Date; | 
|     public static Date DateLocalDate(LocalDate localDate) { | 
|         return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); | 
|     } | 
|   | 
|     //获取现在日期是当月第几周 | 
|     public static int WeeklyNowMonthDay(Date date) { | 
| //        int day = timeDay(date); | 
| //        if (day<7){ | 
| //            if (WeeklyNowMonth(WeeklyMonday(date))>2){ | 
| //                return 1; | 
| //            } | 
| //        } | 
|         return WeeklyNowMonth(WeeklyMonday(date)); | 
|     } | 
|     public static int WeeklyNowMonth(Date date) { | 
| //        LocalDate currentDate = LocalDate.now(); | 
|         LocalDate currentDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date)); | 
|   | 
|         WeekFields weekFields = WeekFields.of(Locale.getDefault()); | 
|   | 
|         int weekOfMonth = currentDate.get(weekFields.weekOfMonth()); | 
|   | 
|   | 
|         return weekOfMonth; | 
|     } | 
|   | 
|     //限制两个日期是周一和周末  工作日  周一到周六 | 
|     public static void WeeklySix(Date date) { | 
| //        LocalDate startDate = LocalDate.of(2022, 9, 5); // 假设开始日期是2022年9月5日,周一 | 
|         LocalDate startDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date)); | 
|         System.out.println("当前日期 " + startDate + " 周"); | 
|   | 
|         LocalDate endDate = startDate.plus(6, ChronoUnit.DAYS); // 结束日期是开始日期加上6天 | 
|         System.out.println("当前日期加上6天是 " + endDate + " 周"); | 
|   | 
|   | 
|         // 如果开始日期不是周一,则将它调整到下一个周一 | 
|         if (startDate.getDayOfWeek() != DayOfWeek.MONDAY) { | 
|             startDate = startDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); | 
|         } | 
|   | 
|         // 如果结束日期不是周末(即周六或周日),则将它调整到下一个周末 | 
|         if (endDate.getDayOfWeek() != DayOfWeek.SATURDAY && endDate.getDayOfWeek() != DayOfWeek.SUNDAY) { | 
|             endDate = endDate.with(TemporalAdjusters.next(DayOfWeek.SATURDAY)); | 
|         } | 
|   | 
|         // 确保两个日期之间相隔七天 | 
|         while (startDate.plus(7, ChronoUnit.DAYS).isBefore(endDate)) { | 
|             startDate = startDate.plus(7, ChronoUnit.DAYS); | 
|         } | 
|   | 
|         System.out.println("开始日期:" + startDate); | 
|         System.out.println("结束日期:" + endDate); | 
|     } | 
|   | 
|     //限制两个日期是周一和周末  周一到周日 | 
|     public static List<Date> WeeklySeven(Date date) { | 
| //        LocalDate startDate = LocalDate.of(2022, 9, 5); // 假设开始日期是2022年9月5日,周一 | 
|         LocalDate startDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date)); | 
| //        System.out.println("当前日期 " + startDate + " 周"); | 
|   | 
|         LocalDate endDate = startDate.plus(6, ChronoUnit.DAYS); // 结束日期是开始日期加上6天 | 
| //        System.out.println("当前日期加上6天是 " + endDate + " 周"); | 
|   | 
|         // 如果开始日期不是周一,则将它调整到下一个周一 | 
|         if (startDate.getDayOfWeek() != DayOfWeek.MONDAY) { | 
|             startDate = startDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); | 
|         } | 
|   | 
|         // 如果结束日期不是周日,则将它调整到下一个周日 | 
|         if (endDate.getDayOfWeek() != DayOfWeek.SUNDAY) { | 
|             endDate = endDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); | 
|         } | 
|   | 
|         // 确保两个日期之间相隔七天 | 
|         while (startDate.plus(7, ChronoUnit.DAYS).isBefore(endDate)) { | 
|             startDate = startDate.plus(7, ChronoUnit.DAYS); | 
|         } | 
|   | 
|         List<Date> dateList = new ArrayList<>(); | 
|         dateList.add(DateLocalDate(startDate)); | 
|         dateList.add(DateLocalDate(endDate)); | 
|         return dateList; | 
| //        System.out.println("开始日期:" + startDate); | 
| //        System.out.println("结束日期:" + endDate); | 
|     } | 
|   | 
|     //判断是不是周一 | 
|     public static boolean WeeklyOneSign(Date date) { | 
|         LocalDate localDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date)); | 
|         // 判断是不是周一 | 
|         if (localDate.getDayOfWeek() != DayOfWeek.MONDAY) { | 
|             return false; | 
|         } | 
|         return true; | 
|     } | 
|   | 
|     //获取本周周一 | 
|     public static Date WeeklyMonday (Date date) { | 
|         LocalDate localDate = LocalDate.of(timeYest(date), timeMonth(date), timeDay(date)); | 
|         // 下周周一 | 
|         localDate = localDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); | 
|   | 
|         // 将LocalDate转换为Date | 
|         Date monday = DateLocalDate(localDate); | 
|   | 
|         // 则将它调整到本周周一 | 
|         return timeFrontSevenYesterday(monday); | 
|     } | 
|   | 
|     //获取当前日期所在的周一及周日时间 | 
|     public static List<Date> WeeklyMondayAndSundayNow(Date date) { | 
|         Date nowMonday = WeeklyMonday(date); | 
|         return WeeklySeven(nowMonday); | 
|     } | 
|   | 
|     //获取当前日期上一周周一及周日时间 | 
|     public static List<Date> WeeklyMondayAndSundayFront(Date date) { | 
|         Date nowMonday = WeeklyMonday(date); | 
|         Date frontSevenYesterday = timeFrontSevenYesterday(nowMonday); | 
|         return WeeklySeven(frontSevenYesterday); | 
|     } | 
|   | 
|     //获取当前日期下一周周一及周日时间 | 
|     public static List<Date> WeeklyMondayAndSundayAfter(Date date) { | 
|         Date nowMonday = WeeklyMonday(date); | 
|         Date afterSevenYesterday = timeAfterSevenYesterday(nowMonday); | 
|         return WeeklySeven(afterSevenYesterday); | 
|     } | 
|   | 
|     //获取周一到周末 | 
|     public static List<Date> WeeklyDays(Date date){ | 
|         Date nowMonday = WeeklyMonday(date); | 
|         List<Date> dateList = new ArrayList<>(); | 
|         dateList.add(nowMonday); | 
|         for (int i = 1; i<7 ; i++){ | 
|             dateList.add(timeYesterdayN(nowMonday,i)); | 
|         } | 
|         return dateList; | 
|     } | 
|   | 
|     //获取周一到周末 | 
|     public static List<Date> WeeklyListDays(List<Date> dates){ | 
|         Date date = dates.get(0); | 
|         Date nowMonday = WeeklyMonday(date); | 
|         List<Date> dateList = new ArrayList<>(); | 
|         dateList.add(nowMonday); | 
|         for (int i = 1; i<7 ; i++){ | 
|             dateList.add(timeYesterdayN(nowMonday,i)); | 
|         } | 
|         return dateList; | 
|     } | 
|   | 
|     public static void main(String[] args) { | 
|         Date now = new Date(); | 
|         int weeklyNowMonth = WeeklyNowMonthDay(now); | 
|         System.out.println("当前日期是第 " + weeklyNowMonth + " 周"); | 
|   | 
|         LocalDate startDate1 = LocalDate.of(2024, 2, 29); | 
|         int weeklyNowMonth1 = WeeklyNowMonthDay(DateLocalDate(startDate1)); | 
|         System.out.println("当前日期是第 " + weeklyNowMonth1 + " 周"); | 
|   | 
|         LocalDate startDate2 = LocalDate.of(2024, 3, 5); | 
|         int weeklyNowMonth2 = WeeklyNowMonthDay(DateLocalDate(startDate2)); | 
|         System.out.println("当前日期是第 " + weeklyNowMonth2 + " 周"); | 
|   | 
|         LocalDate startDate3 = LocalDate.of(2024, 3, 10); | 
|         int weeklyNowMonth3 = WeeklyNowMonthDay(DateLocalDate(startDate3)); | 
|         System.out.println("当前日期是第 " + weeklyNowMonth3 + " 周"); | 
|   | 
|         LocalDate startDate4 = LocalDate.of(2024, 3, 31); | 
|         int weeklyNowMonth4 = WeeklyNowMonthDay(DateLocalDate(startDate4)); | 
|         System.out.println("当前日期是第 " + weeklyNowMonth4 + " 周"); | 
|   | 
|         LocalDate startDate5 = LocalDate.of(2024, 4, 1); | 
|         int weeklyNowMonth5 = WeeklyNowMonthDay(DateLocalDate(startDate5)); | 
|         System.out.println("当前日期是第 " + weeklyNowMonth5 + " 周"); | 
|   | 
|         LocalDate startDate6 = LocalDate.of(2024, 4, 7); | 
|         int weeklyNowMonth6 = WeeklyNowMonthDay(DateLocalDate(startDate6)); | 
|         System.out.println("当前日期是第 " + weeklyNowMonth6 + " 周"); | 
|     } | 
|   | 
| //    public static void main(String[] args) { | 
| //        Date now = new Date(); | 
| //        //本周 | 
| //        List<Date> dateList = WeeklyMondayAndSundayNow(now); | 
| //        for (Date date : dateList){ | 
| //            System.out.println("------------------------------"); | 
| //            System.out.println(date); | 
| //        } | 
| //        //上周 | 
| //        List<Date> dateList1 = WeeklyMondayAndSundayFront(now); | 
| //        for (Date date : dateList1){ | 
| //            System.out.println("------------------------------"); | 
| //            System.out.println(date); | 
| //        } | 
| //        //下周 | 
| //        List<Date> dateList2 = WeeklyMondayAndSundayAfter(now); | 
| //        for (Date date : dateList2){ | 
| //            System.out.println("------------------------------"); | 
| //            System.out.println(date); | 
| //        } | 
| //        //周 | 
| //        List<Date> dateList3 = WeeklyDays(now); | 
| //        for (Date date : dateList3){ | 
| //            System.out.println("------------------------------"); | 
| //            System.out.println(date); | 
| //        } | 
| //    } | 
|   | 
| } |