Module: ActiveSupport::CoreExtensions::Date::Conversions

Included in:
Date
Defined in:
lib/active_support/core_ext/date/conversions.rb

Overview

Converting dates to formatted strings, times, and datetimes.

Constant Summary collapse

DATE_FORMATS =
{
  :short        => "%e %b",
  :long         => "%B %e, %Y",
  :db           => "%Y-%m-%d",
  :number       => "%Y%m%d",
  :long_ordinal => lambda { |date| date.strftime("%B #{date.day.ordinalize}, %Y") }, # => "April 25th, 2007"
  :rfc822       => "%e %b %Y"
}

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

:nodoc:


15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/active_support/core_ext/date/conversions.rb', line 15

def self.included(base) #:nodoc:
  base.instance_eval do
    alias_method :to_default_s, :to_s
    alias_method :to_s, :to_formatted_s
    alias_method :default_inspect, :inspect
    alias_method :inspect, :readable_inspect

    # Ruby 1.9 has Date#to_time which converts to localtime only.
    remove_method :to_time if base.instance_methods.include?(:to_time)

    # Ruby 1.9 has Date#xmlschema which converts to a string without the time component.
    remove_method :xmlschema if base.instance_methods.include?(:xmlschema)
  end
end

Instance Method Details

#readable_inspectObject

Overrides the default inspect method with a human readable one, e.g., “Mon, 21 Feb 2005”


66
67
68
# File 'lib/active_support/core_ext/date/conversions.rb', line 66

def readable_inspect
  strftime("%a, %d %b %Y")
end

#to_dateObject

A method to keep Time, Date and DateTime instances interchangeable on conversions. In this case, it simply returns self.


72
73
74
# File 'lib/active_support/core_ext/date/conversions.rb', line 72

def to_date
  self
end

#to_datetimeObject

Converts a Date instance to a DateTime, where the time is set to the beginning of the day and UTC offset is set to 0.

Example:

date = Date.new(2007, 11, 10)  # => Sat, 10 Nov 2007

date.to_datetime               # => Sat, 10 Nov 2007 00:00:00 0000

97
98
99
# File 'lib/active_support/core_ext/date/conversions.rb', line 97

def to_datetime
  ::DateTime.civil(year, month, day, 0, 0, 0, 0)
end

#to_formatted_s(format = :default) ⇒ Object

Convert to a formatted string. See DATE_FORMATS for predefined formats.

This method is aliased to to_s.

Examples:

date = Date.new(2007, 11, 10)       # => Sat, 10 Nov 2007

date.to_formatted_s(:db)            # => "2007-11-10"
date.to_s(:db)                      # => "2007-11-10"

date.to_formatted_s(:short)         # => "10 Nov"
date.to_formatted_s(:long)          # => "November 10, 2007"
date.to_formatted_s(:long_ordinal)  # => "November 10th, 2007"
date.to_formatted_s(:rfc822)        # => "10 Nov 2007"

Adding your own time formats to to_formatted_s

You can add your own formats to the Date::DATE_FORMATS hash. Use the format name as the hash key and either a strftime string or Proc instance that takes a date argument as the value.

# config/initializers/time_formats.rb
Date::DATE_FORMATS[:month_and_year] = "%B %Y"
Date::DATE_FORMATS[:short_ordinal] = lambda { |date| date.strftime("%B #{date.day.ordinalize}") }

53
54
55
56
57
58
59
60
61
62
63
# File 'lib/active_support/core_ext/date/conversions.rb', line 53

def to_formatted_s(format = :default)
  if formatter = DATE_FORMATS[format]
    if formatter.respond_to?(:call)
      formatter.call(self).to_s
    else
      strftime(formatter)
    end
  else
    to_default_s
  end
end

#to_time(form = :local) ⇒ Object

Converts a Date instance to a Time, where the time is set to the beginning of the day. The timezone can be either :local or :utc (default :local).

Examples:

date = Date.new(2007, 11, 10)  # => Sat, 10 Nov 2007

date.to_time                   # => Sat Nov 10 00:00:00 0800 2007
date.to_time(:local)           # => Sat Nov 10 00:00:00 0800 2007

date.to_time(:utc)             # => Sat Nov 10 00:00:00 UTC 2007

86
87
88
# File 'lib/active_support/core_ext/date/conversions.rb', line 86

def to_time(form = :local)
  ::Time.send("#{form}_time", year, month, day)
end

#xmlschemaObject


101
102
103
# File 'lib/active_support/core_ext/date/conversions.rb', line 101

def xmlschema
  to_time.xmlschema
end