Class: Date
- Includes:
- DateAndTime::Calculations
- Defined in:
- motion/_stdlib/date.rb,
motion/core_ext/date/acts_like.rb,
motion/core_ext/object/to_json.rb,
motion/core_ext/date/conversions.rb,
motion/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 = MotionSupport::Inflector.ordinalize(date.day) date.strftime("%B #{day_format}, %Y") # => "April 25th, 2007" }, :rfc822 => '%e %b %Y', :iso8601 => '%Y-%m-%d', :xmlschema => '%Y-%m-%dT00:00:00Z' }
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
Alias for 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.
- .gregorian_leap?(year) ⇒ Boolean
- .today ⇒ Object
-
.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
- #<<(months) ⇒ Object
- #==(other) ⇒ Object
- #>>(months) ⇒ Object
-
#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 ⇒ Object
-
#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. -
#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).
-
#initialize(year = nil, month = nil, day = nil) ⇒ Date
constructor
A new instance of Date.
- #iso8601 ⇒ Object
-
#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.
- #succ ⇒ Object
- #to_date ⇒ Object
-
#to_formatted_s(format = :default) ⇒ Object
(also: #to_s)
Convert to a formatted string.
- #to_json ⇒ Object
- #to_time ⇒ Object
- #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
Constructor Details
Class Attribute Details
.beginning_of_week_default ⇒ Object
Returns the value of attribute beginning_of_week_default.
5 6 7 |
# File 'motion/core_ext/date/calculations.rb', line 5 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.
10 11 12 |
# File 'motion/core_ext/date/calculations.rb', line 10 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
18 19 20 |
# File 'motion/core_ext/date/calculations.rb', line 18 def beginning_of_week=(week_start) Thread.current[:beginning_of_week] = find_beginning_of_week!(week_start) end |
.current ⇒ Object
Alias for Date.today.
39 40 41 |
# File 'motion/core_ext/date/calculations.rb', line 39 def current ::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.
23 24 25 26 |
# File 'motion/core_ext/date/calculations.rb', line 23 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 |
.gregorian_leap?(year) ⇒ Boolean
2 3 4 5 6 7 8 9 10 11 12 |
# File 'motion/_stdlib/date.rb', line 2 def self.gregorian_leap?(year) if year % 400 == 0 true elsif year % 100 == 0 then false elsif year % 4 == 0 then true else false end end |
.today ⇒ Object
22 23 24 |
# File 'motion/_stdlib/date.rb', line 22 def self.today new end |
Instance Method Details
#<<(months) ⇒ Object
60 61 62 |
# File 'motion/_stdlib/date.rb', line 60 def <<(months) return self >> -months end |
#==(other) ⇒ Object
30 31 32 33 34 |
# File 'motion/_stdlib/date.rb', line 30 def ==(other) year == other.year && month == other.month && day == other.day end |
#>>(months) ⇒ Object
51 52 53 54 55 56 57 58 |
# File 'motion/_stdlib/date.rb', line 51 def >>(months) new_year = year + (self.month + months - 1) / 12 new_month = (self.month + months) % 12 new_month = new_month == 0 ? 12 : new_month new_day = [day, Time.days_in_month(new_month, new_year)].min Date.new(new_year, new_month, new_day) end |
#acts_like_date? ⇒ Boolean
Duck-types as a Date-like class. See Object#acts_like?.
3 4 5 |
# File 'motion/core_ext/date/acts_like.rb', line 3 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
.
93 94 95 96 97 98 99 100 101 |
# File 'motion/core_ext/date/calculations.rb', line 93 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.
46 47 48 |
# File 'motion/core_ext/date/calculations.rb', line 46 def ago(seconds) to_time.since(-seconds) end |
#as_json ⇒ Object
95 96 97 |
# File 'motion/core_ext/object/to_json.rb', line 95 def as_json strftime("%Y-%m-%d") 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)
58 59 60 |
# File 'motion/core_ext/date/calculations.rb', line 58 def beginning_of_day to_time 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)
108 109 110 111 112 113 114 |
# File 'motion/core_ext/date/calculations.rb', line 108 def change() ::Date.new( .fetch(:year, year), .fetch(:month, month), .fetch(:day, day) ) 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)
66 67 68 |
# File 'motion/core_ext/date/calculations.rb', line 66 def end_of_day to_time.end_of_day end |
#iso8601 ⇒ Object
16 17 18 |
# File 'motion/core_ext/date/conversions.rb', line 16 def iso8601 strftime DATE_FORMATS[:iso8601] end |
#minus_with_duration(other) ⇒ Object Also known as: -
:nodoc:
81 82 83 84 85 86 87 |
# File 'motion/core_ext/date/calculations.rb', line 81 def minus_with_duration(other) #:nodoc: if MotionSupport::Duration === other plus_with_duration(-other) else minus_without_duration(other) end end |
#plus_with_duration(other) ⇒ Object Also known as: +
:nodoc:
71 72 73 74 75 76 77 |
# File 'motion/core_ext/date/calculations.rb', line 71 def plus_with_duration(other) #:nodoc: if MotionSupport::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”
55 56 57 |
# File 'motion/core_ext/date/conversions.rb', line 55 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
52 53 54 |
# File 'motion/core_ext/date/calculations.rb', line 52 def since(seconds) to_time.since(seconds) end |
#succ ⇒ Object
78 79 80 |
# File 'motion/_stdlib/date.rb', line 78 def succ self + 1 end |
#to_date ⇒ Object
70 71 72 |
# File 'motion/_stdlib/date.rb', line 70 def to_date self 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}") }
42 43 44 45 46 47 48 49 50 |
# File 'motion/core_ext/date/conversions.rb', line 42 def to_formatted_s(format = :default) formatter = DATE_FORMATS[format] return to_default_s unless formatter return formatter.call(self).to_s if formatter.respond_to?(:call) strftime(formatter) end |
#to_json ⇒ Object
99 100 101 |
# File 'motion/core_ext/object/to_json.rb', line 99 def to_json as_json.to_json end |
#to_time ⇒ Object
74 75 76 |
# File 'motion/_stdlib/date.rb', line 74 def to_time @value end |
#xmlschema ⇒ Object
61 62 63 |
# File 'motion/core_ext/date/conversions.rb', line 61 def xmlschema strftime DATE_FORMATS[:xmlschema] end |