Ruby - 按天分组项目,并在当天开始转移

时间:2017-09-01 05:48:24

标签: ruby-on-rails arrays ruby datetime dictionary

我有一本字典:

{"status": "ok", "data": [{"temp": 22, "datetime": "20160815-0330"}]}

20160815-0330表示2016-08-15 03:30。我希望按进行分组并计算最小值和最大值temp,但该日应该从09:00开始,到08:59结束。我怎么能这样做?

这是我的代码:

@results = @data['data'].group_by { |d| d['datetime'].split('-')[0] }.map do |date, values|
  [date, {
    min_temp: values.min_by { |value| value['temp'] || 0 }['temp'],
    max_temp: values.max_by { |value| value['temp'] || 0 }['temp']
  }]
end

#=> {"20160815"=>{:min_temp =>12, :max_temp =>34}}

我的工作,但起点是00:00,而不是09:00。

1 个答案:

答案 0 :(得分:1)

我建议使用时区技巧:

def adjust_datetime(str)
  DateTime.parse(str.sub('-', '') + '+0900').utc.strftime('%Y%m%d')
end

data.group_by { |d| adjust_datetime(d['datetime']) }

以下是解释:

str = '20160815-0330'
str = str.sub('-', '')   #=> '201608150330'
str = str + '+0900'      #=> '201608150330+0900'
dt = DateTime.parse(str) #=> Mon, 15 Aug 2016 03:30:00 +0900
dt = dt.utc              #=> 2016-08-14 18:30:00 UTC
dt.strftime('%Y%d%m')    #=> '20160814'