2012-09-22 26 views
13

Ví dụ tôi có:Rails làm thế nào để tạo ra một loạt các tháng dựa trên một loạt các ngày

range = start.to_date..(end.to_date + 1.day) 

cuối và bắt đầu là ngày.

Làm cách nào để tạo mảng tháng dựa trên phạm vi này?

Ví dụ:

Tôi có ngày 23/1/2012 và 15/3/2012

Những tháng là Januar, Februar và Marts.

Tôi muốn có được một mảng như ["1/1/2012", "1/2/2012", "1/3/2012"]

và nếu phạm vi được betweeen 25/6/2012 đến 10/10/2012

mảng sẽ là: ["1/6/2012", "1/7/2012", "1/8/2012", "1/9/2012", "1/10/2012"]

+0

... giả định một khoảng thời gian 1 tháng? –

+0

Hãy xem tại đây: http://stackoverflow.com/questions/5887756/rails-calculate-date-range-in-months –

+0

Tôi vừa cập nhật qustion của mình với các ví dụ. –

Trả lời

28
require 'date' 

date_from = Date.parse('2011-10-14') 
date_to = Date.parse('2012-04-30') 
date_range = date_from..date_to 

date_months = date_range.map {|d| Date.new(d.year, d.month, 1) }.uniq 
date_months.map {|d| d.strftime "%d/%m/%Y" } 
# => ["01/10/2011", "01/11/2011", "01/12/2011", "01/01/2012", 
#  "01/02/2012", "01/03/2012", "01/04/2012"] 
6

Rails ActiveSupport các phần mở rộng cốt lõi bao gồm một phương thức cho Date: start_of_month. Chức năng của bạn có thể được viết như sau:

def beginning_of_month_date_list(start, finish) 
    (start.to_date..finish.to_date).map(&:beginning_of_month).uniq.map(&:to_s) 
end 

Hãy cẩn thận: bắt đầu và kết thúc theo thứ tự mong đợi, nhưng nếu không sẽ cung cấp cho bạn những tháng bạn đang tìm kiếm. Bạn cũng có thể viết lại để chuyển biểu tượng định dạng cho phương thứC#to_s để nhận định dạng tháng mong đợi.

+0

Tôi đã thử điều này mà không có may mắn. Tôi cần sử dụng nó cho vòng lặp của tôi, xem thêm tại đây: http://stackoverflow.com/questions/12544533/rails-how-to-create-chart-data-for-each-month-between-2-dates –

+0

Nó sẽ giúp xem kết quả bạn đang nhận được. – rossta

+0

Tôi đã cập nhật câu hỏi với kết quả. –

Các vấn đề liên quan