Enables the use of time calculations within Time itself
- advance
- ago
- at_beginning_of_day
- at_beginning_of_month
- at_beginning_of_quarter
- at_beginning_of_week
- at_beginning_of_year
- at_end_of_month
- at_end_of_quarter
- at_end_of_week
- at_end_of_year
- at_midnight
- beginning_of_day
- beginning_of_month
- beginning_of_quarter
- beginning_of_week
- beginning_of_year
- change
- compare_with_coercion
- end_of_day
- end_of_month
- end_of_quarter
- end_of_week
- end_of_year
- future?
- in
- midnight
- minus_with_coercion
- monday
- months_ago
- months_since
- next_month
- next_week
- next_year
- past?
- prev_month
- prev_year
- seconds_since_midnight
- since
- today?
- tomorrow
- years_ago
- years_since
- yesterday
| COMMON_YEAR_DAYS_IN_MONTH | = | [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] |
Uses Date to provide precise Time calculations for years, months, and days. The options parameter takes a hash with any of these keys: :years, :months, :weeks, :days, :hours, :minutes, :seconds.
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 102
102: def advance(options)
103: unless options[:weeks].nil?
104: options[:weeks], partial_weeks = options[:weeks].divmod(1)
105: options[:days] = (options[:days] || 0) + 7 * partial_weeks
106: end
107:
108: unless options[:days].nil?
109: options[:days], partial_days = options[:days].divmod(1)
110: options[:hours] = (options[:hours] || 0) + 24 * partial_days
111: end
112:
113: d = to_date.advance(options)
114: time_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day)
115: seconds_to_advance = (options[:seconds] || 0) + (options[:minutes] || 0) * 60 + (options[:hours] || 0) * 3600
116: seconds_to_advance == 0 ? time_advanced_by_date : time_advanced_by_date.since(seconds_to_advance)
117: end
Returns a new Time representing the time a number of seconds ago, this is basically a wrapper around the Numeric extension
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 120
120: def ago(seconds)
121: self.since(-seconds)
122: end
Alias for beginning_of_day
Alias for beginning_of_month
Alias for beginning_of_quarter
Alias for beginning_of_week
Alias for beginning_of_year
Alias for end_of_month
Alias for end_of_quarter
Alias for end_of_week
Alias for end_of_year
Alias for beginning_of_day
Returns a new Time representing the start of the day (0:00)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 212
212: def beginning_of_day
213: #(self - seconds_since_midnight).change(:usec => 0)
214: change(:hour => 0, :min => 0, :sec => 0, :usec => 0)
215: end
Returns a new Time representing the start of the month (1st of the month, 0:00)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 226
226: def beginning_of_month
227: #self - ((self.mday-1).days + self.seconds_since_midnight)
228: change(:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
229: end
Returns a new Time representing the start of the quarter (1st of january, april, july, october, 0:00)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 241
241: def beginning_of_quarter
242: beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
243: end
Returns a new Time representing the "start" of this week (Monday, 0:00)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 191
191: def beginning_of_week
192: days_to_monday = self.wday!=0 ? self.wday-1 : 6
193: (self - days_to_monday.days).midnight
194: end
Returns a new Time representing the start of the year (1st of january, 0:00)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 253
253: def beginning_of_year
254: change(:month => 1,:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
255: end
Returns a new Time where one or more of the elements have been changed according to the options parameter. The time options (hour, minute, sec, usec) reset cascadingly, so if only the hour is passed, then minute, sec, and usec is set to 0. If the hour and minute is passed, then sec and usec is set to 0.
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 85
85: def change(options)
86: ::Time.send(
87: self.utc? ? :utc_time : :local_time,
88: options[:year] || self.year,
89: options[:month] || self.month,
90: options[:day] || self.day,
91: options[:hour] || self.hour,
92: options[:min] || (options[:hour] ? 0 : self.min),
93: options[:sec] || ((options[:hour] || options[:min]) ? 0 : self.sec),
94: options[:usec] || ((options[:hour] || options[:min] || options[:sec]) ? 0 : self.usec)
95: )
96: end
Layers additional behavior on Time#<=> so that DateTime and ActiveSupport::TimeWithZone instances can be chronologically compared with a Time
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 300
300: def compare_with_coercion(other)
301: # if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do <=> comparison
302: other = other.comparable_time if other.respond_to?(:comparable_time)
303: if other.acts_like?(:date)
304: # other is a Date/DateTime, so coerce self #to_datetime and hand off to DateTime#<=>
305: to_datetime.compare_without_coercion(other)
306: else
307: compare_without_coercion(other)
308: end
309: end
Returns a new Time representing the end of the day, 23:59:59.999999 (.999999999 in ruby1.9)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 221
221: def end_of_day
222: change(:hour => 23, :min => 59, :sec => 59, :usec => 999999.999)
223: end
Returns a new Time representing the end of the month (end of the last day of the month)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 233
233: def end_of_month
234: #self - ((self.mday-1).days + self.seconds_since_midnight)
235: last_day = ::Time.days_in_month( self.month, self.year )
236: change(:day => last_day, :hour => 23, :min => 59, :sec => 59, :usec => 999999.999)
237: end
Returns a new Time representing the end of the quarter (end of the last day of march, june, september, december)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 247
247: def end_of_quarter
248: beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
249: end
Returns a new Time representing the end of this week (Sunday, 23:59:59)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 199
199: def end_of_week
200: days_to_sunday = self.wday!=0 ? 7-self.wday : 0
201: (self + days_to_sunday.days).end_of_day
202: end
Returns a new Time representing the end of the year (end of the 31st of december)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 259
259: def end_of_year
260: change(:month => 12, :day => 31, :hour => 23, :min => 59, :sec => 59, :usec => 999999.999)
261: end
Tells whether the Time object‘s time lies in the future
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 73
73: def future?
74: self > ::Time.current
75: end
Alias for since
Alias for beginning_of_day
Time#- can also be used to determine the number of seconds between two Time instances. We‘re layering on additional behavior so that ActiveSupport::TimeWithZone instances are coerced into values that Time#- will recognize
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 293
293: def minus_with_coercion(other)
294: other = other.comparable_time if other.respond_to?(:comparable_time)
295: other.is_a?(::DateTime) ? to_f - other.to_f : minus_without_coercion(other)
296: end
Alias for beginning_of_week
Returns a new Time representing the time a number of specified months ago
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 141
141: def months_ago(months)
142: advance(:months => -months)
143: end
Returns a new Time representing the time a number of specified months in the future
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 146
146: def months_since(months)
147: advance(:months => months)
148: end
Short-hand for months_since(1)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 186
186: def next_month
187: months_since(1)
188: end
Returns a new Time representing the start of the given day in next week (default is Monday).
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 206
206: def next_week(day = :monday)
207: days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
208: since(1.week).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
209: end
Short-hand for years_since(1)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 171
171: def next_year
172: years_since(1)
173: end
Tells whether the Time object‘s time lies in the past
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 63
63: def past?
64: self < ::Time.current
65: end
Short-hand for months_ago(1)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 181
181: def prev_month
182: months_ago(1)
183: end
Short-hand for years_ago(1)
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 166
166: def prev_year
167: years_ago(1)
168: end
Seconds since midnight: Time.now.seconds_since_midnight
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 78
78: def seconds_since_midnight
79: self.to_i - self.change(:hour => 0).to_i + (self.usec/1.0e+6)
80: end
Returns a new Time representing the time a number of seconds since the instance time, this is basically a wrapper around the Numeric extension.
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 126
126: def since(seconds)
127: f = seconds.since(self)
128: if ActiveSupport::Duration === seconds
129: f
130: else
131: initial_dst = self.dst? ? 1 : 0
132: final_dst = f.dst? ? 1 : 0
133: (seconds.abs >= 86400 && initial_dst != final_dst) ? f + (initial_dst - final_dst).hours : f
134: end
135: rescue
136: self.to_datetime.since(seconds)
137: end
Tells whether the Time object‘s time is today
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 68
68: def today?
69: self.to_date == ::Date.current
70: end
Convenience method which returns a new Time representing the time 1 day since the instance time
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 270
270: def tomorrow
271: advance(:days => 1)
272: end
Returns a new Time representing the time a number of specified years ago
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 151
151: def years_ago(years)
152: advance(:years => -years)
153: end
Returns a new Time representing the time a number of specified years in the future
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 156
156: def years_since(years)
157: advance(:years => years)
158: end
Convenience method which returns a new Time representing the time 1 day ago
[ show source ]
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 265
265: def yesterday
266: advance(:days => -1)
267: end