首页 > 编程语言 >java 时间段划分 1.把一个时间段划分为 整天 和非整天的时间段 2. 把List<LocalDate> 按相邻的day , 划分为一个时间段,并且每个时间段 最大为3

java 时间段划分 1.把一个时间段划分为 整天 和非整天的时间段 2. 把List<LocalDate> 按相邻的day , 划分为一个时间段,并且每个时间段 最大为3

时间:2024-08-08 10:16:24浏览次数:16  
标签:end 07 2024 start 划分 时间段 整天 LocalDate

 

时间段划分   

1.把一个时间段划分为 整天 和非整天的时间段  

例如: "2024-07-11 08:30:00"  ~   "2024-07-23 08:30:00";

例如 完整的日期:

2024-07-12 2024-07-13 2024-07-14 2024-07-15 2024-07-16 2024-07-17 2024-07-18 2024-07-19 2024-07-20 2024-07-21 2024-07-22

不完整的日期时间戳段:

2024-07-11 08:30:00 - 2024-07-11 23:59:59 2024-07-23 00:00:00 - 2024-07-23 08:30:00

 

2.已经知道 List<LocalDate> localDay 例如 2024-07-11 2024-07-12 2024-07-15  2024-07-16 2024-07-17 2024-07-18  2024-07-19  2024-07-28

 把相邻的day , 划分为一个时间段,并且每个时间段 最大为3天

 

 


import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/***************************
 *<pre>
 * @File Name    : BaseTesst
 * @Author       :  Sea
 * @Mail         :  [email protected]
 * @Date         : 2024/8/7 17:45
 * @Purpose      :
 * @History      :
 *</pre>
 ***************************/
public class BaseTesst {



    /**
     * 把一个时间段划分为 整天 和非整天的时间段
     * @param fromDateStr "2024-07-11 08:30:00";
     * @param toDateStr  "2024-07-23 08:30:00";
     * @return  map{full->list<LocalDate>  ,part ->list<Long> }
     */
    public static HashMap<String, List> getDateRange(String fromDateStr , String toDateStr) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(TimeZone.getTimeZone("Asia/Shanghai").toZoneId());
        LocalDateTime fromDateTime = LocalDateTime.parse(fromDateStr, formatter);
        LocalDateTime toDateTime = LocalDateTime.parse(toDateStr, formatter);

        List<LocalDate> fullDays = new ArrayList<>();
        List<List<Long>> partialDaysTimestamps = new ArrayList<>();
        // 获取开始和结束日期
        LocalDate startDate = fromDateTime.toLocalDate();
        LocalDate endDate = toDateTime.toLocalDate();
        // 遍历日期范围
        for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
            if (date.equals(startDate) && fromDateTime.toLocalTime().isAfter(LocalTime.MIN)) {
                // 从开始日期的时间部分不在整天内
                long startTimestamp = Timestamp.valueOf(fromDateTime).getTime()/1000;
                long endTimestamp = Timestamp.valueOf(date.atTime(LocalTime.MAX)).getTime()/1000;
//                String startTimestamp = fromDateTime.format(formatter);
//                String endTimestamp = date.atTime(LocalTime.MAX).format(formatter);
                partialDaysTimestamps.add(Arrays.asList(startTimestamp,endTimestamp));
            } else if (date.equals(endDate) && toDateTime.toLocalTime().isBefore(LocalTime.MAX)) {
                // 至结束日期的时间部分不在整天内
                long startTimestamp = Timestamp.valueOf(date.atTime(LocalTime.MIN)).getTime()/1000;
                long endTimestamp = Timestamp.valueOf(toDateTime).getTime()/1000;
//                String startTimestamp = date.atTime(LocalTime.MIN).format(formatter);
//                String endTimestamp = toDateTime.format(formatter);
                partialDaysTimestamps.add(Arrays.asList(startTimestamp,endTimestamp));
            } else {
                // 完整的一天
                fullDays.add(date);
            }
        }

        HashMap<String, List> result = new HashMap<>();
        result.put("full",fullDays);
        result.put("part",partialDaysTimestamps);
        System.out.println("完整的日期:");
        fullDays.forEach(System.out::println);
        System.out.println("不完整的日期时间戳段:");
        partialDaysTimestamps.forEach(System.out::println);
        return result;
    }

      @Test
       public void testGetDateRange() throws Exception {
            String fromDateStr =  "2024-07-11 08:30:00";
            String  toDateStr =  "2024-07-14 08:30:00";
          getDateRange(fromDateStr,toDateStr);
//          完整的日期:
//          2024-07-12
//          2024-07-13
//          不完整的日期时间戳段:
//         [1720657800, 1720713599]
//         [1721664000, 1721694600]
        }

    /**
     * 将相邻的 LocalDate 划分为时间段,同时确保每个时间段的最大长度为 3 天
     * @throws Exception
     */
   @Test
    public void testGroupDateRanges() throws Exception {
           // 创建一个 LocalDate 列表
           List<LocalDate> localDays = Arrays.asList(
                   LocalDate.of(2024, 7, 11),
                   LocalDate.of(2024, 7, 12) ,
                   LocalDate.of(2024, 7, 15),
                   LocalDate.of(2024, 7, 16),
                   LocalDate.of(2024, 7, 17),
                   LocalDate.of(2024, 7, 18),
                   LocalDate.of(2024, 7, 19),
                   LocalDate.of(2024, 7, 20),
                   LocalDate.of(2024, 7, 21),
                   LocalDate.of(2024, 7, 25)
           );

           // 划分时间段
       List<List<LocalDate>>  dateRanges = groupDateRanges(localDays,3);
           // 输出结果
           for (List<LocalDate> range : dateRanges) {
               System.out.println(formatRange(range.get(0),range.get(range.size()-1)));
           }
//       2024-07-11 to 2024-07-12
//       2024-07-15 to 2024-07-17
//       2024-07-18 to 2024-07-20
//       2024-07-21
//       2024-07-25
       }

    /**
     * 将相邻的 LocalDate 划分为时间段,同时确保每个时间段的最大长度为 3 天
     * @param localDays
     * @param maxIntervalDay
     * @return
     */
    private static List<List<LocalDate>>  groupDateRanges(List<LocalDate> localDays,int maxIntervalDay) {
        List<List<LocalDate>>  ranges = new ArrayList<>();
        if (localDays.isEmpty()) {
            return ranges;
        }

        LocalDate start = localDays.get(0);
        LocalDate end = start;

        for (int i = 1; i < localDays.size(); i++) {
            LocalDate current = localDays.get(i);
            // 检查当前日期与上一个日期的差异
            if (current.equals(end.plusDays(1))) {
                end = current;  // 继续扩展当前时间段
            } else {
                // 检查时间段长度是否超过 3 天
                addRange(ranges, start, end,maxIntervalDay);
                start = current;  // 开始新的时间段
                end = start;
            }
        }
        // 添加最后一个时间段
        addRange(ranges, start, end,maxIntervalDay);
        return ranges;
    }

    private static void addRange(List<List<LocalDate>> ranges, LocalDate start, LocalDate end,int intervalDay) {
        while (!start.isAfter(end)) {
            LocalDate rangeEnd = start.plusDays(intervalDay-1);  // 最大 3 天(起始日 + 2)
            if (rangeEnd.isAfter(end)) {
                rangeEnd = end;  // 不超过实际结束日期
            }
//            ranges.add(formatRange(start, rangeEnd));
            ranges.add(Arrays.asList(start, rangeEnd));
            start = rangeEnd.plusDays(1);  // 移动到下一个时间段的开始
        }
    }

    private static String formatRange(LocalDate start, LocalDate end) {
        if (start.equals(end)) {
            return start.toString();  // 单个日期
        } else {
            return start + " to " + end;  // 时间段
        }
    }
}

 

 

标签:end,07,2024,start,划分,时间段,整天,LocalDate
From: https://www.cnblogs.com/lshan/p/18348427

相关文章

  • 思科交换机的VLAN划分1
    #交换机的VLAN配置##任务一交换机的VLAN划分#vlan中的网络用户是通过lan交换机来通信的。一个vlan中的成员看不到另一个vlan中的成员。因此vlan划分能有效地控制网络广播风暴,提高网络的安全可靠性,是有效的网络监控、数据流量控制的手段,还能实现不同地理位置的部门间的局域网......
  • 凸多边形 k 划分计数
    凸多边形k划分计数给定\(n,k\),求凸\(n\)边形划分成\(k\)个不相交部分的方案数。sol先引入一个定理:Raney定理:和为\(1\)的整数序列的所有循环位移序列中有且仅有一个满足任意前缀和大于0。证明可以考虑任取一个循环位移序列,然后求前缀和,找到最靠右的前缀和最小的位......
  • JVM内存结构划分
    JVM内存结构的划分1.堆就相当于当你new一个对象的时候,就会分配一个堆内存给你,当对象销毁时就会有垃圾回收机制来回收这个对象的堆空间。2.栈就好比一串珠子,你只能从一头加或者取,要取后面的就要把前面的取出来才可以。3.堆内存作用就是用来存放java中的对象和数组,当new一个......
  • JVM内存结构的划分
    JVM内存结构的划分目录JVM内存结构的划分JVM内存区域1.栈(Stack)2.堆(Heap)3.方法区(MethodArea)4.程序计数器(ProgramCounterRegister)5.本地方法栈(NativeMethodStack)堆和栈的主要区别示例Java虚拟机(JVM)的内存模型是Java程序运行的基础之一,理解JVM内存结构对于深入学习Java编......
  • 代码随想录算法训练营第二十六天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763
    写代码的第二十六天继续贪心贪心!!!452.用最少数量的箭引爆气球思路最少的弓箭引爆气球,那么就是要看有没有重复覆盖的区域,如果有的话,那么一个弓箭就能引爆重复区域的气球,所以本题就是要看有多少气球是重复的,如果重复就用一根弓箭,如果不重复就加一。解决问题1:如何判断是否......
  • P5665 [CSP-S2019] 划分
    思路:首先求出\(a\)的前缀和数组\(s\)。考虑动态规划,令\(dp_{i,j}\)表示以\(i\)结尾,末尾有\(j\)个为一组的最小答案,则状态转移方程为:\[dp_{i,j}=\min[s_{i-j}-s_{i-j-k}\les_i-s_{i-j}]dp_{i-j,k}+(s_i-s_{i-j})^2\]朴素直接转移是\(O(N^3)\)的,可以得到......
  • 网络层IP协议,网段划分,NAT转换
    网络层IP协议1.IP协议的基本认识2.IP协议如何进主机定位和报文转发3.IP分片和组装4.IP协议报头格式5.网段划分如何进行网段划分(子网,公网)分类划分法子网掩码特殊的IP地址6.私有IP地址和公网IP地址7.IP地址数量限制问题8.NAT网络地址转换机制NAT简介工作原理......
  • JVM内存结构划分
    JVM内存结构划分JVM(Java虚拟机)的内存结构主要划分为以下几个部分:堆(Heap)概述:堆是JVM中最大的一块内存区域,用于存储对象实例和数组。堆内存是垃圾收集器管理的主要区域,因此也被称为“GC堆”。细分:堆内存可以分为年轻代(YoungGeneration)和老年代(OldGeneration)。年轻代又进一......
  • JVM内存区域的划分
    程序计数器程序计数器是一块较小的内存空间,它可以看作当前线程所执行的字节码的行号指示器,在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖于程序计数器来完成。......
  • JVM内存结构划分
    栈"栈"(Stack)是一种遵循后进先出(LastInFirstOut,LIFO)原则的抽象数据类型。以下是栈的一些基本特点和操作:特点:LIFO原则:最后加入栈的元素将是第一个被移除的元素。动态大小:栈的大小可以根据需要动态变化。线性结构:元素存储在栈中的方式是线性的,但只能从一端(栈顶)访问。基......