如何计算日期列表的每小时范围计数并生成Map<String hours, count>
按小时时间段统计日期记录并生成Map结果
数据库层面直接查询(推荐)
如果数据存储在数据库中,直接通过SQL分组统计是最高效的方式,以MySQL为例:
SELECT CONCAT(HOUR(datetime_column), '-', HOUR(datetime_column) + 1) AS hour_range, COUNT(*) AS count FROM your_table -- 可选:限定特定日期统计 -- WHERE DATE(datetime_column) = '2023-07-18' GROUP BY hour_range ORDER BY hour_range;
说明:
HOUR(datetime_column)提取时间字段的小时部分CONCAT将小时拼接成X-X+1的时间段格式GROUP BY hour_range按时间段分组统计数量- 执行后直接返回你需要的时间段与对应计数,可直接映射为目标Map结构
Java代码层面处理
如果已将日期数据加载到内存中,可通过Java 8+的Stream API快速生成目标Map:
处理LocalDateTime列表
import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.stream.Collectors; // 假设dateList是从数据库查询到的日期列表 List<LocalDateTime> dateList = ...; Map<String, Long> hourCountMap = dateList.stream() .map(dateTime -> { int hour = dateTime.getHour(); return String.format("%d-%d", hour, hour + 1); }) .collect(Collectors.groupingBy( segment -> segment, Collectors.counting() ));
处理Date列表
如果是java.util.Date类型,需先转换为LocalDateTime:
import java.util.Date; import java.time.Instant; import java.time.ZoneId; import java.util.List; import java.util.Map; import java.util.stream.Collectors; List<Date> dateList = ...; Map<String, Long> hourCountMap = dateList.stream() .map(date -> { LocalDateTime dateTime = date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); int hour = dateTime.getHour(); return String.format("%d-%d", hour, hour + 1); }) .collect(Collectors.groupingBy(segment -> segment, Collectors.counting()));
说明:
- 先将每个日期转换为
X-X+1格式的时间段字符串 - 利用
Collectors.groupingBy和Collectors.counting完成分组统计 - 最终得到的
hourCountMap即为需求中的Map<String, 计数>结构
内容的提问来源于stack exchange,提问作者Karthick
相关产品推荐
相关产品推荐

