Class: Date
- Includes:
- DateAndTime::Calculations
- Defined in:
- activesupport/lib/active_support/json/encoding.rb,
activesupport/lib/active_support/core_ext/date/zones.rb,
activesupport/lib/active_support/core_ext/date/acts_like.rb,
activesupport/lib/active_support/core_ext/date/conversions.rb,
activesupport/lib/active_support/core_ext/date/calculations.rb
Constant Summary collapse
- DATE_FORMATS =
{ :short => '%e %b', :long => '%B %e, %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 => '%e %b %Y' }
Constants included from DateAndTime::Calculations
DateAndTime::Calculations::DAYS_INTO_WEEK
Class Attribute Summary collapse
-
.beginning_of_week_default ⇒ Object
Returns the value of attribute beginning_of_week_default.
Class Method Summary collapse
-
.beginning_of_week ⇒ Object
Returns the week start (e.g. :monday) for the current request, if this has been set (via Date.beginning_of_week=).
-
.beginning_of_week=(week_start) ⇒ Object
Sets
Date.beginning_of_week
to a week start (e.g. :monday) for current request/thread. -
.current ⇒ Object
Returns Time.zone.today when
Time.zone
orconfig.time_zone
are set, otherwise just returns Date.today. -
.find_beginning_of_week!(week_start) ⇒ Object
Returns week start day symbol (e.g. :monday), or raises an ArgumentError for invalid day symbol.
-
.tomorrow ⇒ Object
Returns a new Date representing the date 1 day after today (i.e. tomorrow’s date).
-
.yesterday ⇒ Object
Returns a new Date representing the date 1 day ago (i.e. yesterday’s date).
Instance Method Summary collapse
-
#acts_like_date? ⇒ Boolean
Duck-types as a Date-like class.
-
#advance(options) ⇒ Object
Provides precise Date calculations for years, months, and days.
-
#ago(seconds) ⇒ Object
Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00) and then subtracts the specified number of seconds.
-
#as_json(options = nil) ⇒ Object
:nodoc:.
-
#beginning_of_day ⇒ Object
(also: #midnight, #at_midnight, #at_beginning_of_day)
Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00).
-
#change(options) ⇒ Object
Returns a new Date where one or more of the elements have been changed according to the
options
parameter. -
#compare_with_coercion(other) ⇒ Object
(also: #<=>)
Allow Date to be compared with Time by converting to DateTime and relying on the <=> from there.
-
#end_of_day ⇒ Object
(also: #at_end_of_day)
Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59).
-
#in_time_zone(zone = ::Time.zone) ⇒ Object
Converts Date to a TimeWithZone in the current zone if Time.zone or Time.zone_default is set, otherwise converts Date to a Time via Date#to_time.
-
#minus_with_duration(other) ⇒ Object
(also: #-)
:nodoc:.
-
#plus_with_duration(other) ⇒ Object
(also: #+)
:nodoc:.
-
#readable_inspect ⇒ Object
(also: #inspect)
Overrides the default inspect method with a human readable one, e.g., “Mon, 21 Feb 2005”.
-
#since(seconds) ⇒ Object
(also: #in)
Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00) and then adds the specified number of seconds.
-
#to_formatted_s(format = :default) ⇒ Object
(also: #to_s)
Convert to a formatted string.
-
#to_time(form = :local) ⇒ Object
Converts a Date instance to a Time, where the time is set to the beginning of the day.
- #xmlschema ⇒ Object
Methods included from DateAndTime::Calculations
#beginning_of_month, #beginning_of_quarter, #beginning_of_week, #beginning_of_year, #days_ago, #days_since, #days_to_week_start, #end_of_month, #end_of_quarter, #end_of_week, #end_of_year, #future?, #monday, #months_ago, #months_since, #next_month, #next_quarter, #next_week, #next_year, #past?, #prev_month, #prev_quarter, #prev_week, #prev_year, #sunday, #today?, #tomorrow, #weeks_ago, #weeks_since, #years_ago, #years_since, #yesterday
Class Attribute Details
.beginning_of_week_default ⇒ Object
Returns the value of attribute beginning_of_week_default
12 13 14 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 12 def beginning_of_week_default @beginning_of_week_default end |
Class Method Details
.beginning_of_week ⇒ Object
Returns the week start (e.g. :monday) for the current request, if this has been set (via Date.beginning_of_week=). If Date.beginning_of_week
has not been set for the current request, returns the week start specified in config.beginning_of_week
. If no config.beginning_of_week was specified, returns :monday.
17 18 19 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 17 def beginning_of_week Thread.current[:beginning_of_week] || beginning_of_week_default || :monday end |
.beginning_of_week=(week_start) ⇒ Object
Sets Date.beginning_of_week
to a week start (e.g. :monday) for current request/thread.
This method accepts any of the following day symbols: :monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday
25 26 27 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 25 def beginning_of_week=(week_start) Thread.current[:beginning_of_week] = find_beginning_of_week!(week_start) end |
.current ⇒ Object
Returns Time.zone.today when Time.zone
or config.time_zone
are set, otherwise just returns Date.today.
46 47 48 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 46 def current ::Time.zone ? ::Time.zone.today : ::Date.today end |
.find_beginning_of_week!(week_start) ⇒ Object
Returns week start day symbol (e.g. :monday), or raises an ArgumentError for invalid day symbol.
30 31 32 33 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 30 def find_beginning_of_week!(week_start) raise ArgumentError, "Invalid beginning of week: #{week_start}" unless ::Date::DAYS_INTO_WEEK.key?(week_start) week_start end |
Instance Method Details
#acts_like_date? ⇒ Boolean
Duck-types as a Date-like class. See Object#acts_like?.
5 6 7 |
# File 'activesupport/lib/active_support/core_ext/date/acts_like.rb', line 5 def acts_like_date? true end |
#advance(options) ⇒ Object
Provides precise Date calculations for years, months, and days. The options
parameter takes a hash with any of these keys: :years
, :months
, :weeks
, :days
.
100 101 102 103 104 105 106 107 108 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 100 def advance() = .dup d = self d = d >> .delete(:years) * 12 if [:years] d = d >> .delete(:months) if [:months] d = d + .delete(:weeks) * 7 if [:weeks] d = d + .delete(:days) if [:days] d end |
#ago(seconds) ⇒ Object
Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00) and then subtracts the specified number of seconds.
53 54 55 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 53 def ago(seconds) in_time_zone.since(-seconds) end |
#as_json(options = nil) ⇒ Object
:nodoc:
327 328 329 330 331 332 333 |
# File 'activesupport/lib/active_support/json/encoding.rb', line 327 def as_json( = nil) #:nodoc: if ActiveSupport.use_standard_json_time_format strftime("%Y-%m-%d") else strftime("%Y/%m/%d") end end |
#beginning_of_day ⇒ Object Also known as: midnight, at_midnight, at_beginning_of_day
Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
65 66 67 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 65 def beginning_of_day in_time_zone end |
#change(options) ⇒ Object
Returns a new Date where one or more of the elements have been changed according to the options
parameter. The options
parameter is a hash with a combination of these keys: :year
, :month
, :day
.
Date.new(2007, 5, 12).change(day: 1) # => Date.new(2007, 5, 1)
Date.new(2007, 5, 12).change(year: 2005, month: 1) # => Date.new(2005, 1, 12)
115 116 117 118 119 120 121 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 115 def change() ::Date.new( .fetch(:year, year), .fetch(:month, month), .fetch(:day, day) ) end |
#compare_with_coercion(other) ⇒ Object Also known as: <=>
Allow Date to be compared with Time by converting to DateTime and relying on the <=> from there.
124 125 126 127 128 129 130 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 124 def compare_with_coercion(other) if other.is_a?(Time) self.to_datetime <=> other else compare_without_coercion(other) end end |
#end_of_day ⇒ Object Also known as: at_end_of_day
Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59)
73 74 75 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 73 def end_of_day in_time_zone.end_of_day end |
#in_time_zone(zone = ::Time.zone) ⇒ Object
Converts Date to a TimeWithZone in the current zone if Time.zone or Time.zone_default is set, otherwise converts Date to a Time via Date#to_time
Time.zone = 'Hawaii' # => 'Hawaii'
Date.new(2000).in_time_zone # => Sat, 01 Jan 2000 00:00:00 HST -10:00
You can also pass in a TimeZone instance or string that identifies a TimeZone as an argument, and the conversion will be based on that zone instead of Time.zone
.
Date.new(2000).in_time_zone('Alaska') # => Sat, 01 Jan 2000 00:00:00 AKST -09:00
15 16 17 18 19 20 21 |
# File 'activesupport/lib/active_support/core_ext/date/zones.rb', line 15 def in_time_zone(zone = ::Time.zone) if zone ::Time.find_zone!(zone).local(year, month, day) else to_time end end |
#minus_with_duration(other) ⇒ Object Also known as: -
:nodoc:
88 89 90 91 92 93 94 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 88 def minus_with_duration(other) #:nodoc: if ActiveSupport::Duration === other plus_with_duration(-other) else minus_without_duration(other) end end |
#plus_with_duration(other) ⇒ Object Also known as: +
:nodoc:
78 79 80 81 82 83 84 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 78 def plus_with_duration(other) #:nodoc: if ActiveSupport::Duration === other other.since(self) else plus_without_duration(other) end end |
#readable_inspect ⇒ Object Also known as: inspect
Overrides the default inspect method with a human readable one, e.g., “Mon, 21 Feb 2005”
61 62 63 |
# File 'activesupport/lib/active_support/core_ext/date/conversions.rb', line 61 def readable_inspect strftime('%a, %d %b %Y') end |
#since(seconds) ⇒ Object Also known as: in
Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00) and then adds the specified number of seconds
59 60 61 |
# File 'activesupport/lib/active_support/core_ext/date/calculations.rb', line 59 def since(seconds) in_time_zone.since(seconds) end |
#to_formatted_s(format = :default) ⇒ Object Also known as: to_s
Convert to a formatted string. See DATE_FORMATS for predefined formats.
This method is aliased to to_s
.
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] = ->(date) { date.strftime("%B #{date.day.ordinalize}") }
46 47 48 49 50 51 52 53 54 55 56 |
# File 'activesupport/lib/active_support/core_ext/date/conversions.rb', line 46 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).
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
76 77 78 |
# File 'activesupport/lib/active_support/core_ext/date/conversions.rb', line 76 def to_time(form = :local) ::Time.send(form, year, month, day) end |
#xmlschema ⇒ Object
80 81 82 |
# File 'activesupport/lib/active_support/core_ext/date/conversions.rb', line 80 def xmlschema in_time_zone.xmlschema end |