From: Rob Biedenharn Date: 2007-01-23T07:26:01+09:00 Subject: Re: find monday of first week of the month On Jan 22, 2007, at 4:25 PM, Daniel Liebig wrote: > Hi, > > im pretty new to Ruby and i tried to find out how to calculate the > date for the first monday of the first week of the month (i.e. this > would be 2007-01-29 for Feb. 2007) > My approach is to get the weekday of the first day of the month and > calculate back from there. By getting the weekday i can tell how > far to calculate back (if necessary at all). If i'm calcualating > back from janurary, i also have to switch back the year. > > So this is what i came out with: > > year = 2007 > month = 2 > > # get the weekday of the first day of the month > first_wd = Date.new(year, month, 1).wday > > # if weekday is sunday > if first_wd == 0 > date_modifier = - 6 > > #if weekday is monday > elsif first_wd == 1 > date_modifier = 1 > > # any other day > else > date_modifier = - ( first_wd - 1 ) > end > > #if i have to count back, swith month (and year) back > if date_modifier < 0 > if month > 1 > month -= 1 > else > month = 12 > year -= 1 > end > end > > # get date with calculated modifier > date_start = Date.new(year, month, date_modifier ) > > Ok, this works, but it seems pretty complicated to me. Is there a > smarter (and more readable) way to do this? As far as i know Ruby > right now, it's pretty unusual if an "easy" problem like this needs > more than three lines of code ;). > > Thx for any help > Regards > Daniel > Your attempt isn't too far off from the Time#beginning_of_week from ActiveSupport # File vendor/rails/activesupport/lib/active_support/core_ext/ time/calculations.rb, line 128 128: def beginning_of_week 129: days_to_monday = self.wday!=0 ? self.wday-1 : 6 130: (self - days_to_monday.days).midnight 131: end Working just with a Date, that gives you: >> feb=Date.new(2007,2,1) => # >> feb.to_s => "2007-02-01" >> feb -= (feb.wday != 0 ? feb.wday-1 : 6) => # >> feb.to_s => "2007-01-29" What about January 2008? >> jan08 = Date.new(2008,1,1) => # >> jan08 -= (jan08.wday !=0 ? jan08.wday-1 : 6) => # >> jan08.to_s => "2007-12-31" You shouldn't have too much trouble wrapping that up into a nice little method of your own. -Rob Rob Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com