【问题标题】:Ruby add 31 days to date string within 2d arrayRuby 在二维数组中添加 31 天日期字符串
【发布时间】:2014-09-25 12:21:34
【问题描述】:

我有一个二维数组。

 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”和“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"]

【问题讨论】:

  • 我很好,你的方法!
  • 例如:“2014-01-12”和“2012-08-31”和“2012-08-31”是什么意思?那是指什么?
  • 鉴于@konsolebox 的回答和您对它的评论,您对changed_date 的表达具有误导性,因为它表明您想要一个日期对象数组,而不是日期字符串。如果您在答案中包含“期望的结果”,则可以避免这种情况;即changed_date => [["2014-01-12", "2014-02-12", "2014-01-12"],...]。当你举一个例子(这是非常可取的)时,最好同时给出你得到的结果和你想要的。
  • 感谢您的反馈!刚开始时可能需要学习大量的东西,晚上知道如何提出一个好问题是一个持续的学习过程。

标签: ruby arrays string date


【解决方案1】:

如你所问,所以我在写..但是你的方式是完美的。

#!/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。

【讨论】:

  • @BorisStitnicky 很高兴见到你。我正在阅读你所说的。充满希望。
  • 我刚刚回复,请查看您的电子邮件。
【解决方案2】:

你做对了,但你正在改变你的数组形式。也许你应该这样做

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"); }

【讨论】:

  • 谢谢,您找到了我遇到的问题的核心,但我没有意识到是我正在更改的数据形式导致我在某些环境中出现问题。
  • 很好的心灵融合。需要注意的是,这两个都是修改array.
【解决方案3】:

您写了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"]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多