Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Date, Time, and DateTime support formatting blocks in addition to str…

…ftime strings. Introduce :long_ordinal format, e.g. 'February 21st, 2005'. Closes #8191.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6844 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit ad4f1fd630dbeeb66b9cde0979518b4af96201ad 1 parent c4a3156
Jeremy Kemper jeremy authored
2  activesupport/CHANGELOG
View
@@ -1,5 +1,7 @@
*SVN*
+* Date, Time, and DateTime support formatting blocks in addition to strftime strings. Introduce :long_ordinal format, e.g. "February 21st, 2005". #8191 [Coda Hale]
+
* Document Object#blank?. #6491 [Chris Mear]
* Date, Time, and DateTime#to_json. #8399 [wycats]
17 activesupport/lib/active_support/core_ext/date/conversions.rb
View
@@ -4,9 +4,10 @@ module Date #:nodoc:
# Getting dates in different convenient string representations and other objects
module Conversions
DATE_FORMATS = {
- :short => "%e %b",
- :long => "%B %e, %Y",
- :db => "%Y-%m-%d"
+ :short => "%e %b",
+ :long => "%B %e, %Y",
+ :db => "%Y-%m-%d",
+ :long_ordinal => lambda { |date| date.strftime("%B #{date.day.ordinalize}, %Y") } # => "April 25th, 2007"
}
def self.included(klass) #:nodoc:
@@ -15,7 +16,15 @@ def self.included(klass) #:nodoc:
end
def to_formatted_s(format = :default)
- DATE_FORMATS[format] ? strftime(DATE_FORMATS[format]).strip : to_default_s
+ if formatter = DATE_FORMATS[format]
+ if formatter.respond_to?(:call)
+ formatter.call(self).to_s
+ else
+ strftime(formatter).strip
+ end
+ else
+ to_default_s
+ end
end
# To be able to keep Dates and Times interchangeable on conversions
22 activesupport/lib/active_support/core_ext/date_time/conversions.rb
View
@@ -8,26 +8,36 @@ module Conversions
:time => "%H:%M",
:short => "%d %b %H:%M",
:long => "%B %d, %Y %H:%M",
- :rfc822 => "%a, %d %b %Y %H:%M:%S %z"
+ :long_ordinal => lambda { |datetime| datetime.strftime("%B #{datetime.day.ordinalize}, %Y %H:%M") },
+ :rfc822 => "%a, %d %b %Y %H:%M:%S %z",
}
+
def self.included(klass)
klass.send(:alias_method, :to_datetime_default_s, :to_s)
klass.send(:alias_method, :to_s, :to_formatted_s)
end
-
+
def to_formatted_s(format = :default)
- DATE_FORMATS[format] ? strftime(DATE_FORMATS[format]).strip : to_datetime_default_s
+ if formatter = DATE_FORMATS[format]
+ if formatter.respond_to?(:call)
+ formatter.call(self).to_s
+ else
+ strftime(formatter).strip
+ end
+ else
+ to_datetime_default_s
+ end
end
def to_date
::Date.new(year, month, day)
end
-
+
# To be able to keep Times and DateTimes interchangeable on conversions
def to_datetime
self
- end
+ end
end
end
end
-end
+end
27 activesupport/lib/active_support/core_ext/time/conversions.rb
View
@@ -4,20 +4,29 @@ module Time #:nodoc:
# Getting times in different convenient string representations and other objects
module Conversions
DATE_FORMATS = {
- :db => "%Y-%m-%d %H:%M:%S",
- :time => "%H:%M",
- :short => "%d %b %H:%M",
- :long => "%B %d, %Y %H:%M",
- :rfc822 => "%a, %d %b %Y %H:%M:%S %z"
+ :db => "%Y-%m-%d %H:%M:%S",
+ :time => "%H:%M",
+ :short => "%d %b %H:%M",
+ :long => "%B %d, %Y %H:%M",
+ :long_ordinal => lambda { |time| time.strftime("%B #{time.day.ordinalize}, %Y %H:%M") },
+ :rfc822 => "%a, %d %b %Y %H:%M:%S %z"
}
def self.included(klass)
klass.send(:alias_method, :to_default_s, :to_s)
klass.send(:alias_method, :to_s, :to_formatted_s)
end
-
+
def to_formatted_s(format = :default)
- DATE_FORMATS[format] ? strftime(DATE_FORMATS[format]).strip : to_default_s
+ if formatter = DATE_FORMATS[format]
+ if formatter.respond_to?(:call)
+ formatter.call(self).to_s
+ else
+ strftime(formatter).strip
+ end
+ else
+ to_default_s
+ end
end
def to_date
@@ -28,11 +37,11 @@ def to_date
def to_time
self
end
-
+
# converts to a Ruby DateTime instance; preserves utc offset
def to_datetime
::DateTime.civil(year, month, day, hour, min, sec, Rational(utc_offset, 86400), 0)
- end
+ end
end
end
end
7 activesupport/test/core_ext/date_ext_test.rb
View
@@ -2,9 +2,10 @@
class DateExtCalculationsTest < Test::Unit::TestCase
def test_to_s
- assert_equal "21 Feb", Date.new(2005, 2, 21).to_s(:short)
- assert_equal "February 21, 2005", Date.new(2005, 2, 21).to_s(:long)
- assert_equal "2005-02-21", Date.new(2005, 2, 21).to_s(:db)
+ assert_equal "21 Feb", Date.new(2005, 2, 21).to_s(:short)
+ assert_equal "February 21, 2005", Date.new(2005, 2, 21).to_s(:long)
+ assert_equal "February 21st, 2005", Date.new(2005, 2, 21).to_s(:long_ordinal)
+ assert_equal "2005-02-21", Date.new(2005, 2, 21).to_s(:db)
end
def test_to_time
13 activesupport/test/core_ext/date_time_ext_test.rb
View
@@ -2,11 +2,14 @@
class DateTimeExtCalculationsTest < Test::Unit::TestCase
def test_to_s
- assert_equal "2005-02-21 14:30:00", DateTime.new(2005, 2, 21, 14, 30, 0).to_s(:db)
- assert_equal "14:30", DateTime.new(2005, 2, 21, 14, 30, 0).to_s(:time)
- assert_equal "21 Feb 14:30", DateTime.new(2005, 2, 21, 14, 30, 0).to_s(:short)
- assert_equal "February 21, 2005 14:30", DateTime.new(2005, 2, 21, 14, 30, 0).to_s(:long)
- assert_equal "Mon, 21 Feb 2005 14:30:00 +0000", DateTime.new(2005, 2, 21, 14, 30, 0).to_s(:rfc822)
+ datetime = DateTime.new(2005, 2, 21, 14, 30, 0)
+
+ assert_equal "2005-02-21 14:30:00", datetime.to_s(:db)
+ assert_equal "14:30", datetime.to_s(:time)
+ assert_equal "21 Feb 14:30", datetime.to_s(:short)
+ assert_equal "February 21, 2005 14:30", datetime.to_s(:long)
+ assert_equal "Mon, 21 Feb 2005 14:30:00 +0000", datetime.to_s(:rfc822)
+ assert_equal "February 21st, 2005 14:30", datetime.to_s(:long_ordinal)
end
def test_to_date
9 activesupport/test/core_ext/time_ext_test.rb
View
@@ -272,10 +272,11 @@ def test_next_week_near_daylight_end
def test_to_s
time = Time.local(2005, 2, 21, 17, 44, 30)
- assert_equal "2005-02-21 17:44:30", time.to_s(:db)
- assert_equal "21 Feb 17:44", time.to_s(:short)
- assert_equal "17:44", time.to_s(:time)
- assert_equal "February 21, 2005 17:44", time.to_s(:long)
+ assert_equal "2005-02-21 17:44:30", time.to_s(:db)
+ assert_equal "21 Feb 17:44", time.to_s(:short)
+ assert_equal "17:44", time.to_s(:time)
+ assert_equal "February 21, 2005 17:44", time.to_s(:long)
+ assert_equal "February 21st, 2005 17:44", time.to_s(:long_ordinal)
time = Time.utc(2005, 2, 21, 17, 44, 30)
assert_equal "Mon, 21 Feb 2005 17:44:30 +0000", time.to_s(:rfc822)
Please sign in to comment.
Something went wrong with that request. Please try again.