数组中的日期范围,Ruby

26
我在想如何用ruby(在rails3中)自动创建一个"Jan 21"样式等的上个月日期数组。如果今天是2月6日,那么数组将是["Jan 6", "Jan 7"... "Feb 6"]。

我不理解这个问题。答案是否取决于当前日期?还是其他输入?输出会是什么样子?也许你应该提供一些示例输入和输出,并考虑是否有人能够理解这个问题,即使他们对你的问题一无所知。 - DigitalRoss
抱歉之前表述不够清晰!我已经更新了问题 :) - Elliot
3个回答

78

我不确定自己是否完全理解了问题,但是这里提供一个可能有帮助的答案。

(1.month.ago.to_date..Date.today).map{ |date| date.strftime("%b %d") }

输出

["Jan 07", "Jan 08", "Jan 09", "Jan 10", "Jan 11", "Jan 12", "Jan 13", "Jan 14", "Jan 15", "Jan 16", "Jan 17", "Jan 18", "Jan 19", "Jan 20", "Jan 21", "Jan 22", "Jan 23", "Jan 24", "Jan 25", "Jan 26", "Jan 27", "Jan 28", "Jan 29", "Jan 30", "Jan 31", "Feb 01", "Feb 02", "Feb 03", "Feb 04", "Feb 05", "Feb 06"] 

你可以创建一系列日期,然后使用strftime将它们转换为所需的格式。
只需确保在范围上使用Date对象而不是Time对象,否则您将创建包含该时间段中每秒的数组。

3
请注意操作时间范围时的细节,一定要按照上面所示的方式将其转换为日期格式。谢谢。 - edavey
2
如果你不在rails3中,你需要确保包含activesupport,require 'active_support/all' - slm
1
"1" 是从哪里来的?.month. 是从哪里来的?它们是在 activesupport 中吗?'1.month.ago' 这个东西是 Rails 的特性吗? - JDS

11
require 'date'
now = Date.today
p (now<<1 .. now).map{ |day| day.strftime("%b %-e") }
# No railsy .month.ago.to_date silliness!
# the dash in `%-e` gets rid of the occasional extra space. Credit @Grizz in the comments.

输出:

["Jan 7", "Jan 8", "Jan 9", "Jan 10", (...), "Feb 7"]

关于 DateTime,"<<" 运算符是什么意思?它看起来像是“往前推一个月”,但这种语法非常晦涩,我找不到在 DateTime 类方面的文档说明。 - JDS
DateTime继承自Date(文档中将Date列为父类)。<<方法在那里有记录。它确实会向前推一个月。 - steenslag
谢谢。我在谷歌上搜索“<<”时遇到了麻烦。 - JDS
1
如果您在 %e 使用 -,它将不会使用额外的空格填充单个数字的天数,并且可以消除 .squeeze 方法的需要。 因此应该是 "%b %-e" - Grizz

0
start = "01/09/2021"
finish = "31/09/2021"
(start.to_date..finish.to_date).map(&:to_s)

2
这可能需要一些解释来说明它如何回答这个问题 :) - Emi OB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接