将日期格式转换为另一种格式

时间:2017-10-02 09:34:06

标签: ruby-on-rails ruby date

我有一个哈希,其键是以"%W %Y"格式表示日期的字符串:

{"11 2016"=>255000.0, "12 2016"=>255000.0, "13 2016"=>255000.0, "14 2016"=>255000.0, "15 2016"=>255000.0, "16 2016"=>255000.0, "17 2016"=>255000.0, "18 2016"=>255000.0, "19 2016"=>255000.0, "20 2016"=>255000.0}

我想将密钥转换为月/年格式以获得如下内容:

{"March 2016"=>255000.0, "March 2016"=>255000.0, "April 2016"=>255000.0, "April 2016"=>255000.0, "April 2016"=>255000.0, "May 2016"=>255000.0, "May 2016"=>255000.0, "May 2016"=>255000.0, "June 2016"=>255000.0, "June 2016"=>255000.0}

我试过了:

更新

def conv_to_month(hash)
    dates_array = []
    values = []
    hash.each do |k, v|
        date = Date.strptime(k, '%W %Y')
        newdate = date.strftime('%B %Y')
        puts newdate
        dates_array << newdate
        values << v
    end
    result = Hash[dates_array.zip(values)]
end

但是我收到了无效的日期错误,我不明白为什么。

2 个答案:

答案 0 :(得分:3)

您可以通过strptime解析日期字符串:

date = Date.strptime('11 2016', '%W %Y')
#=> #<Date: 2016-03-14>

并通过strftime重新格式化生成的日期:

date.strftime('%B %Y')
#=> "March 2016"

请注意,哈希只能包含一次密钥,因此您无法使用"March 2016"的两个密钥(除非您启用compare_by_identity) 。您可能希望使用数组,或者 - 或者 - 在打印字符串时使用给定的哈希并使用帮助器格式化字符串(格式通常与视图相关)。

答案 1 :(得分:0)

一种简单的方法是:

data = {"11 2016"=>255000.0, "12 2016"=>255000.0, "13 2016"=>255000.0, "14 2016"=>255000.0, "15 2016"=>255000.0, "16 2016"=>255000.0, "17 2016"=>255000.0, "18 2016"=>255000.0, "19 2016"=>255000.0, "20 2016"=>255000.0}

data.map {|k, v| month, year = k.split(' '); [[ Date::MONTHNAMES[month.to_i], year].join(' '), v]}.to_h

但在这种情况下,日期的第一部分必须正确对应月份数。像1将是1月,12将是12月。