Ruby Date
hỗ trợ sản xuất những ngày kế tiếp và cung cấp phương thức next_month
có thể được sử dụng để lặp lại hiệu quả qua nhiều tháng.
Dưới đây là một phương pháp chung mà thích nghi với độ chính xác của đầu vào của bạn:
require 'date'
def date_tuples(from,to)
prec = from.size
start = Date.new(*from)
finish = Date.new(*to)
filter_on = [:day,:mon].first(3-prec)
filter = ->(d) { filter_on.all? {|attr| d.send(attr) == 1 } }
(start..finish)
.select(&filter)
.map { |d| [d.year,d.mon,d.day].first(prec) }
end
[7] pry(main)> date_tuples([2012],[2015])
=> [[2012], [2013], [2014], [2015]]
[8] pry(main)> date_tuples([2012,10],[2013,3])
=> [[2012, 10], [2012, 11], [2012, 12], [2013, 1], [2013, 2], [2013, 3]]
[9] pry(main)> date_tuples([2012,10,25],[2012,11,6])
=> [[2012, 10, 25],
[2012, 10, 26],
[2012, 10, 27],
[2012, 10, 28],
[2012, 10, 29],
[2012, 10, 30],
[2012, 10, 31],
[2012, 11, 1],
[2012, 11, 2],
[2012, 11, 3],
[2012, 11, 4],
[2012, 11, 5],
[2012, 11, 6]]
Đối với những gì nó có giá trị , nếu bạn có quyền truy cập vào 'ActiveSupport' trong dự án của bạn' Phạm vi' có thể được mở rộng đơn giản để làm việc với các kích thước bước biến với hỗ trợ múi giờ (xem http://stackoverflow.com/questions/19093487/ruby-create-range-of -dates/19094504 # answer-19094504). – captainpete