beginning_of_weekconfig option has been merged to Rails master, so starting from Rails 4.0 we’ll gain full control over the week start day.
PrefaceWorking on Interstellar, I’ve found out that ActiveSupport has a lot of useful methods like
Date#end_of_weekand many others. However, there was a small thing that was quite a bit annoying: all those API methods were tied to Monday as the first day of a week. Not a big deal while developing web applications targeted to European market, but working on a US oriented stuff it might be useful to set Sunday as the beginning of a week. Sure, you can fix this in a couple of methods… But hey, we are open source community, right?
We can patch it up baby…The first patch I come up with was an extension that makes possible to pass week start to
end_of_weekmethods. It was accepted and merged into Rails 3.2 relatively fast.And all was great, but there was another bunch of cool API methods:
prev_week. They already have a single argument: a day in next (previous) week. That said, we cannot pass week start as an argument to these guys. One of the possible solutions was an application wide config option for the week start. In this case, we can use
prev_weekwithout having to pass the start of the week manually. So I hit another pull request with the
beginning_of_weekconfig option. It took more than 6 months to get this merged, and now I’m happy as I can be. Since Rails 4.0 we’ll get full access to ActiveSupport calendaring API.Examples:
Time.now.beginning_of_week.to_date #=> Mon, 22 Oct 2012
Time.now.beginning_of_week(:sunday).to_date #=> Sun, 21 Oct 2012
Date.beginning_of_week = :thursday
Time.now.next_week.to_date #=> Thu, 25 Oct 2012
Instead of epilogueThere’s a lot of stuff out there that still should be improved. For example,
Datenow knows too much about
Week. Begging for a separate class (as Jeremy stated).Another thing is that Rails stores week days in a different way than Ruby:
It’s time to contribute, so go for it!
Date::DAYS_INTO_WEEK[:monday] #=> 0
Time.now.monday.wday #=> 1 (because Ruby stores Sunday as zero week day)