You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算日期列表的每小时范围计数并生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:08:10