extends core Date - Rails code reading
activesupport/lib/active_support/core_ext/date/conversions.rb
to_sで指定できるフォーマットを拡張している。
一番上に対応するフォーマットが定義されている。
class Date DATE_FORMATS = { :short => '%d %b', :long => '%B %d, %Y', :db => '%Y-%m-%d', :number => '%Y%m%d', :long_ordinal => lambda { |date| day_format = ActiveSupport::Inflector.ordinalize(date.day) date.strftime("%B #{day_format}, %Y") # => "April 25th, 2007" }, :rfc822 => '%d %b %Y', :iso8601 => lambda { |date| date.iso8601 } }
formatが文字列かlamdaかをrespond_to?(:call) で判別している。
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 alias_method :to_default_s, :to_s alias_method :to_s, :to_formatted_s
activesupport/lib/active_support/core_ext/date/calculations.rb
Date#+が日の加算処理、Date#>>が月の加算処理
# Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with # any of these keys: <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>. def advance(options) options = options.dup d = self d = d >> options.delete(:years) * 12 if options[:years] d = d >> options.delete(:months) if options[:months] d = d + options.delete(:weeks) * 7 if options[:weeks] d = d + options.delete(:days) if options[:days] d end