Ruby在2d数组中添加31天的日期字符串

时间:2014-08-02 11:57:24

标签: ruby arrays string date

我有一个二维数组。

 array = [["2014-01-12", "2014-01-12", "2014-01-12"],
          ["2012-08-26", "2012-10-18", "2012-08-31"],
          ["2013-04-09", "2013-05-22", "2013-07-01"]]

我需要在每个子阵列的第三个值中添加31天(例如:" 2014-01-12"&" 2012-08-31"&&# 34; 2012-07-01")

我考虑过这样的事情:

changed_date = array.map { |due| ((Date.strptime(due[2], "%Y-%m-%d"))+ 31) }

但是想看看有什么其他方法可以做到这一点......

谢谢!

编辑:

我需要将结果作为一个字符串数组,其中row.last还有31天。生成的数组应如下所示:

array = ["2014-02-12", "2012-09-31", "2012-08-31"]

3 个答案:

答案 0 :(得分:2)

正如你所说,我正在写作..但你的方式是完美的。

#!/usr/bin/env ruby

require 'date'

array = [["2014-01-12", "2014-01-12", "2014-01-12"],
         ["2012-08-26", "2012-10-18", "2012-08-31"],
         ["2013-04-09", "2013-05-22", "2013-07-01"]]

p array.map { |a| Date.parse(a[2]).next_day(31) }
# => [#<Date: 2014-02-12 ((2456701j,0s,0n),+0s,2299161j)>,
# #<Date: 2012-10-01 ((2456202j,0s,0n),+0s,2299161j)>, 
# #<Date: 2013-08-01 ((2456506j,0s,0n),+0s,2299161j)>]

next_day([n=1]) → date

  

此方法相当于d + n。

答案 1 :(得分:1)

你做得对,但你正在改变阵列形式。也许你应该做

array.map{ |due| due[2] = (Date.strptime(due[2]) + 31).strftime("%Y-%m-%d"); due }

或者

array.each{ |due| due[2] = (Date.strptime(due[2]) + 31).strftime("%Y-%m-%d"); }

答案 2 :(得分:1)

您编写changed_date = array.map..并且显然希望changed_map成为字符串数组的事实,您似乎希望该方法是非破坏性的;也就是说,保持array不变。如果是这种情况,@ konsolebox的答案需要稍微修改一下:

array.map{ |row|
        row[0..-2] << (Date.strptime(row.last) + 31).strftime("%Y-%m-%d") }
  #=> [["2014-01-12", "2014-01-12", "2014-02-12"],
  #    ["2012-08-26", "2012-10-18", "2012-10-01"],
  #    ["2013-04-09", "2013-05-22", "2013-08-01"]]
array
  #=> [["2014-01-12", "2014-01-12", "2014-01-12"],
  #    ["2012-08-26", "2012-10-18", "2012-08-31"],
  #    ["2013-04-09", "2013-05-22", "2013-07-01"]]

可替换地,

t = array.transpose
  #=> [["2014-01-12", "2012-08-26", "2013-04-09"],
  #    ["2014-01-12", "2012-10-18", "2013-05-22"],
  #    ["2014-01-12", "2012-08-31", "2013-07-01"]]

(t[0..-2] << t.last.map { |d| (Date.strptime(d) + 31).strftime("%Y-%m-%d") })
  .transpose
  #=> [["2014-01-12", "2014-01-12", "2014-02-12"],
  #    ["2012-08-26", "2012-10-18", "2012-10-01"],
  #    ["2013-04-09", "2013-05-22", "2013-08-01"]]