我正在创建一个12个月的折线图,其中包含过去12个月的数据。当前月份或第12个订单项应该说OCT 13
。第一个项目应该是OCT 12
。
我怎么能写一些东西来动态拉动当前月份以及之前的11个月,一直回到去年的当月。我遇到的问题是确保去年10月被标记为2012年的一个月,但在3个月内,我需要将1月标记为2013而不更改代码。
答案 0 :(得分: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"
]
答案 1 :(得分: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的输入来改变顺序。
答案 2 :(得分: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"]
答案 3 :(得分: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
=&gt;
[[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
的所有括号。任何人都可以解释为什么我需要在第二行使用外部的那些?