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

Ruby:如何将Time实例数组转换为指定结构的哈希表?

实现方法(Ruby示例)

嘿,这个需求用Ruby来实现非常直观,我给你一步步拆解:

步骤1:准备数据

首先把你的Time实例数组定义好(实际项目里你可以直接用已有数组):

time_array = [
  Time.new(2018, 5, 23, 8, 0, 0),
  Time.new(2018, 5, 23, 8, 30, 0),
  Time.new(2018, 5, 23, 9, 30, 0),
  Time.new(2018, 5, 24, 15, 0, 0),
  Time.new(2018, 5, 24, 15, 30, 0)
]

步骤2:按日期分组并过滤(可选)

从你的期望结果来看,2018-05-23只保留了9点前的时间,2018-05-24没有保留任何时间,这里我们可以先按日期分组,再过滤掉不符合要求的时间:

# 按日期字符串分组,同时过滤出上午9点前的时间并转成指定字符串格式
grouped_data = time_array.group_by do |time|
  time.strftime("%Y-%m-%d") # 把Time实例转成"YYYY-MM-DD"格式的日期字符串作为键
end.transform_values do |times|
  # 只保留小时小于9的时间,再转成你需要的字符串格式
  times.select { |t| t.hour < 9 }.map { |t| t.strftime("%Y-%m-%d %H:%M:%S") }
end

步骤3:确保目标日期都在结果中

如果需要指定必须包含的日期(比如不管有没有符合条件的时间都要显示),可以遍历目标日期列表构建最终哈希:

# 定义你需要包含的目标日期
target_dates = ["2018-05-23", "2018-05-24"]

# 构建最终结果哈希,没有对应数据的日期设为空数组
result = target_dates.each_with_object({}) do |date, hash|
  hash[date] = grouped_data[date] || []
end

# 输出结果
p result
# => {"2018-05-23"=>["2018-05-23 08:00:00", "2018-05-23 08:30:00"], "2018-05-24"=>[]}

补充说明

  • 如果不需要过滤时间(只是示例里的期望输出写错了),删掉select { |t| t.hour < 9 }这部分即可,这样2018-05-24就会包含对应的两个时间字符串。
  • 如果不需要指定固定日期,想自动包含原数组中所有出现过的日期,可以把target_dates换成:
    target_dates = time_array.map { |t| t.strftime("%Y-%m-%d") }.uniq
    

内容的提问来源于stack exchange,提问作者Noémie Harvey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:50:38