0

我正在创建一个包含前 12 个月数据的 12 个月折线图。当前月份或第 12 行项目应显示为OCT 13。第一个项目应该说OCT 12.

我怎样才能写一些东西来动态地拉动当前月份以及前 11 个月,一直回到去年的当前月份。我遇到的问题是确保去年 10 月被标记为 2012 年的一个月,但在 3 个月内我需要将 1 月标记为 2013 年,而无需更改代码。

4

4 回答 4

2
a = [Date.today.prev_year]
12.times{a.push(a.last.next_month)}
a.map{|d| d.strftime("%^b %y")}

# => [
  "OCT 12",
  "NOV 12",
  "DEC 12",
  "JAN 13",
  "FEB 13",
  "MAR 13",
  "APR 13",
  "MAY 13",
  "JUN 13",
  "JUL 13",
  "AUG 13",
  "SEP 13",
  "OCT 13"
]
于 2013-10-11T22:11:50.347 回答
1

使用<<运算符将​​日期移动一个月

require "date"

12.downto(0).map{ |d| (Date.today <<  d).strftime("%^b %y") } 
#=> ["OCT 12", "NOV 12", "DEC 12", "JAN 13", "FEB 13", "MAR 13", "APR 13",
#     "MAY 13", "JUN 13", "JUL 13", "AUG 13", "SEP 13", "OCT 13"]

使用@Stefan 的输入来更改顺序。

于 2013-10-11T22:11:47.733 回答
0
require 'date'

def last_n_months(n, format='%^b %Y')
  (n+1).times.map { |i| (Date.today << i).strftime(format) }
end

last_n_months(12)
# => ["OCT 2013", "SEP 2013", "AUG 2013", "JUL 2013", "JUN 2013", "MAY 2013", "APR 2013", "MAR 2013", "FEB 2013", "JAN 2013", "DEC 2012", "NOV 2012", "OCT 2012"]
于 2013-10-11T22:40:53.910 回答
0

是的,使用Date#methods是去这里的方式,是的,它们是获取今天的日期所必需的,但是滚动你自己的不是更令人满意吗?这是一种方法:

# Assume start_year falls in current millenium. 1 <= start_month <= 12

MONTHS = %q[JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC].split

def doit(start_year, start_month)
  pairs = (((start_month-1)..11).to_a.product [start_year-1]) +
    ((0..(start_month-1)).to_a.product [start_year]) 
  pairs.map! {|p| MONTHS[p.first] + " #{p.last.to_s}"}.reverse
end

p doit(13, 10)

首先创建pairs=>

[[9, 12], [10, 12], [11, 12]] +
[[0, 13], [1, 13], [2, 13], [3, 13], [4, 13], [5, 13], [6, 13], [7, 13], [8, 13], [9, 13]]

这是

[[9, 12], [10, 12], [11, 12], [0, 13], [1, 13], [2, 13], [3, 13],
 [4, 13], [5, 13], [6, 13], [7, 13], [8, 13], [9, 13]]

然后用包含月份缩写和年份的字符串替换对的元素。

["OCT 13", "SEP 13", "AUG 13", "JUL 13", "JUN 13", "MAY 13", "APR 13",
 "MAR 13", "FEB 13", "JAN 13", "DEC 12", "NOV 12", "OCT 12"]                      

我显然需要计算所有括号pairs。谁能解释为什么我需要第二行的外部?

于 2013-10-12T23:19:27.323 回答