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);
}
}
结果