Java代码实现数据按时间段分组

Java代码实现数据按时间段分组

需求:将一个集合中的数据按2小时进行分段处理

实现:

DTO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TimeDTO implements Serializable {
    private static final long serialVersionUID = -392888618243669508L;

    private Integer id;

    private LocalDateTime createTime;
}

核心逻辑

    private static Map<String,List<TimeDTO>> segmentTime(List<TimeDTO> list,int segment){

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
        return list.stream()
                .collect(Collectors.groupingBy(r->r.getCreateTime().withHour(r.getCreateTime().getHour()/segment).format(dtf)));
    }

验证

 public static void main(String[] args) {
        ArrayList<TimeDTO> dtos = new ArrayList<>();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
        dtos.add(new TimeDTO(1, LocalDateTime.now()));
        dtos.add(new TimeDTO(2, LocalDateTime.parse("2023-01-01 01:01:01",dtf)));
        dtos.add(new TimeDTO(3, LocalDateTime.parse("2023-01-01 02:01:01",dtf)));
        dtos.add(new TimeDTO(4, LocalDateTime.parse("2023-01-01 02:10:01",dtf)));
        dtos.add(new TimeDTO(5, LocalDateTime.parse("2023-01-05 02:10:01",dtf)));

        Map<String,List<TimeDTO>> map = segmentTime(dtos,2);
        for (Map.Entry<String, List<TimeDTO>> entry : map.entrySet()) {
            List<TimeDTO> value = entry.getValue();
            String time = entry.getKey();
            LocalDateTime parse = LocalDateTime.parse(time, dtf1);
            LocalDateTime start = parse.withHour(parse.getHour() * 2);
            String ids = value.stream().map(TimeDTO::getId).map(String::valueOf).collect(Collectors.joining(","));
            System.out.println("时间段:"+start+"至"+start.plusHours(2)+";2小时内数据:"+ids);
        }
    }

结果

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值