Working with Dates
in
Ruby on Rails
Nick Nguyen
@thenicknguyen
Ruby Date/Time
$ irb> Date.new => #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)>> Time.new => 2013-11-10 20:43:21 -0600> DateTime.new=> #<DateTime: -4712-01-01T00:00:00+00:00 ((0j,0s,0n),+0s,2299161j)>
Strftime
> Date.today.strftime("%B %d, %Y")=> "November 11, 2013"> Date.today.strftime("%m/%d/%y")=> "11/11/13"> DateTime.now.strftime("%H:%M")=> "13:06"
Date.parse
> Date.parse("2013-11-11")=> #<Date: 2013-11-11 ...>> Date.parse("11/11/2013")=> #<Date: 2013-11-11 ...>> Date.parse("11-11-13") => #<Date: 2011-11-13 ((2455818j,0s,0n),+0s,2299161j)># OOPS!
Strptime
> Date.strptime("2013-11-11", "%Y-%m-%d")=> #<Date: 2013-11-11 ... >> Date.strptime("11/11/2013", "%m/%d/%Y")=> #<Date: 2013-11-11 ... >> Date.strptime("11-11-13", "%m-%d-%y")=> #<Date: 2013-11-11 ... >
Rails Date/Time
$ rails c> Date.new => Mon, 01 Jan -4712> Time.new => 2013-11-10 21:02:13 -0600> DateTime.new => Mon, 01 Jan -4712 00:00:00 +0000
What's up with that?
ActiveSupport
Provides Ruby language extensions and utilities.
http://guides.rubyonrails.org/active_support_core_extensions.html
https://github.com/rails/rails/tree/master/activesupport/lib/active_support/core_ext
Displaying Dates/Times
# open_camp/app/views/tasks/_task.html.erb<div class="span2"> <%= task.due_date %> </div>
Displaying Dates/Times

Change Date Format
# open_camp/app/views/tasks/_task.html.erb<div class="span2"> <%= task.due_date.strftime("%b %d, %Y") %></div>
Change Date Format

Define Custom Format
via Localization
# config/locales/en.ymlen:hello: "Hello world" date: formats: awesometown: "%b %d, %y"
# app/views/tasks/_task.html.erb<div class="span2"> <%= l task.due_date, :format => :awesometown %> </div>
Define Custom Format

Define Custom Format
via Initializer
2.0.0p247 :025 > Date::DATE_FORMATS=> {:short=>"%e %b",:long=>"%B %e, %Y",:db=>"%Y-%m-%d",:number=>"%Y%m%d", :long_ordinal=>#<Proc:0x007f8d7aa31100@/Users/nick/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.13/lib/active_support/core_ext/date/conversions.rb:12 (lambda)>, :rfc822=>"%e %b %Y"}
# config/initializers/date_formats.rbDate::DATE_FORMATS[:awesometown] = "%b %d, %y"
# app/views/tasks/_task.html.erb<div class="span2"> <%= task.due_date.to_s(:awesometown) %> </div>
Set as Default
# config/initializers/date_formats.rbDate::DATE_FORMATS[:default] = "%b %d, %y"
# app/views/tasks/_task.html.erb<div class="span2"> <%= task.due_date %> </div>
Extensions to Date/DateTime
yesterdaytomorrowbeginning_of_week (at_beginning_of_week)end_of_week (at_end_of_week)mondaysundayweeks_agoprev_week (last_week)next_weekmonths_agomonths_sincebeginning_of_month (at_beginning_of_month)end_of_month (at_end_of_month)prev_month (last_month)next_monthbeginning_of_quarter (at_beginning_of_quarter)end_of_quarter (at_end_of_quarter)beginning_of_year (at_beginning_of_year)end_of_year (at_end_of_year)years_agoyears_sinceprev_year (last_year)next_year |
$ irb> Date.today.tomorrow => NoMethodError: undefined method `tomorrow' for #<Date: 2013-11-11 ...> Date.today.next_week=> NoMethodError: undefined method `next_week' for #<Date: 2013-11-11 ...> Date.today.beginning_of_year=> NoMethodError: undefined method `beginning_of_year' for #<Date: 2013-11-11 ...
$ rails c> Date.today.tomorrow => Tue, 12 Nov 2013> Date.today.next_week => Mon, 18 Nov 2013> Date.today.beginning_of_year => Tue, 01 Jan 2013
Open Camp Exercise
Add the ability to repeat a task daily, weekly, monthly until a specified date.
Use ActiveSupport extensions to make your life easier and code easier to understand.
Working with Dates in Rails
By Nick Nguyen
Working with Dates in Rails
- 3,125