我想生成一个特定月份的所有日期,从该月的1号到该月的30或31号,而无需使用琐碎的for
循环:
for i in 1..Time.days_in_month(Date.today.month, Date.today.year)
date = Date.new(y, m, i)
end
我正在得到这样的日期,但是我不应该使用这个琐碎的for循环。
答案 0 :(得分:7)
尽管有很多种方法可以完成此操作,但一种方法是将Ruby Range
与Time#beginning_of_month
和Time#end_of_month
方法结合使用以生成包含所有内容的对象每月的几天,然后将其转换为数组:
(Date.today.beginning_of_month..Date.today.end_of_month).to_a
=> [Fri, 01 Nov 2019, Sat, 02 Nov 2019, Sun, 03 Nov 2019, Mon, 04 Nov 2019, Tue, 05 Nov 2019, Wed, 06 Nov 2019, ...., Fri, 29 Nov 2019, Sat, 30 Nov 2019]
另一种选择是使用Time#all_month
帮助程序,它很简单:
Date.today.all_month.to_a
=> [Fri, 01 Nov 2019, Sat, 02 Nov 2019, Sun, 03 Nov 2019, Mon, 04 Nov 2019, Tue, 05 Nov 2019, Wed, 06 Nov 2019, ...., Fri, 29 Nov 2019, Sat, 30 Nov 2019]
答案 1 :(得分:2)
(普通的Ruby)Date类使用负数作为从末尾开始计数的一种方式(例如在数组中):
require "date"
today = Date.today
m, y = today.month, today.year
p (Date.new(y,m,1) .. Date.new(y,m,-1)).to_a