From: Siep Korteling Date: 2008-03-05T06:36:17+09:00 Subject: Re: making a monthly calendar... Mikkel Bruun wrote: (...) >> require 'date' >> require 'enumerator' >> >> def days_to_show(year, month, num_week_rows) >> # returns an array of the dates in month, >> # with the last days of the preceding month >> # and the first days of the next month >> >> first_of_month = Date.new(year, month, 1) >> first = first_of_month - (first_of_month.wday)+1 >> # +1 for weeks starting on monday, remove for weeks starting on sunday >> last = first + (num_week_rows * 7) >> (first...last).to_a >> end >> >> days = days_to_show(2008, 3, 6) >> days.each_slice(7) do |week| >> print "| " >> week.each{|day| print day.to_s + "\t| "} >> puts >> end >> (...) > > What happens when you run ays = days_to_show(2008, 6, 6) ??? it shows > june as starting on sunday 2 of june.... > > really wierd > > Mikkel Argh.. Date#wday gives with a zero for sunday. But there is good luck to be found in ruby. With Date#cwday Monday is commercial day-of-week 1; Sunday is commercial day-of-week 7. Fine by me. require 'date' require 'enumerator' def days_to_show(year, month, num_week_rows = 6) # returns an array of the dates in month, # with the last days of the preceding month # and the first days of the next mont first_of_month = Date.new(year, month, 1) first = first_of_month - first_of_month.cwday + 1 # +1 for weeks starting on monday, remove for weeks starting on sunday last = first + num_week_rows * 7 (first...last).to_a end 1.upto(12) do |month| days = days_to_show(2008,month) days.each_slice(7) do |week| week.each{|day| print "| " + day.mday.to_s + "\t"} puts "|" end puts end Behaves better. Regards, Siep -- Posted via http://www.ruby-forum.com/.