如何创建特定月份的日期

时间:2019-11-05 16:11:41

标签: ruby-on-rails ruby

我想生成一个特定月份的所有日期,从该月的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循环。

2 个答案:

答案 0 :(得分:7)

尽管有很多种方法可以完成此操作,但一种方法是将Ruby RangeTime#beginning_of_monthTime#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