Module: ActiveSupport::CoreExtensions::Time::Calculations

Included in:
Time
Defined in:
lib/active_support/core_ext/time/calculations.rb

Overview

Enables the use of time calculations within Time itself

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

:nodoc:



6
7
8
9
10
11
12
13
14
15
# File 'lib/active_support/core_ext/time/calculations.rb', line 6

def self.included(base) #:nodoc:
  base.extend ClassMethods

  base.class_eval do
    alias_method :plus_without_duration, :+
    alias_method :+, :plus_with_duration
    alias_method :minus_without_duration, :-
    alias_method :-, :minus_with_duration
  end
end

Instance Method Details

#advance(options) ⇒ Object

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.



76
77
78
79
80
81
# File 'lib/active_support/core_ext/time/calculations.rb', line 76

def advance(options)
  d = to_date.advance(options)
  time_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day)
  seconds_to_advance = (options[:seconds] || 0) + (options[:minutes] || 0) * 60 + (options[:hours] || 0) * 3600
  seconds_to_advance == 0 ? time_advanced_by_date : time_advanced_by_date.since(seconds_to_advance)
end

#ago(seconds) ⇒ Object

Returns a new Time representing the time a number of seconds ago, this is basically a wrapper around the Numeric extension Do not use this method in combination with x.months, use months_ago instead!



85
86
87
# File 'lib/active_support/core_ext/time/calculations.rb', line 85

def ago(seconds)
  self.since(-seconds)
end

#beginning_of_dayObject Also known as: midnight, at_midnight, at_beginning_of_day

Returns a new Time representing the start of the day (0:00)



157
158
159
# File 'lib/active_support/core_ext/time/calculations.rb', line 157

def beginning_of_day
  (self - self.seconds_since_midnight).change(:usec => 0)
end

#beginning_of_monthObject Also known as: at_beginning_of_month

Returns a new Time representing the start of the month (1st of the month, 0:00)



170
171
172
173
# File 'lib/active_support/core_ext/time/calculations.rb', line 170

def beginning_of_month
  #self - ((self.mday-1).days + self.seconds_since_midnight)
  change(:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
end

#beginning_of_quarterObject Also known as: at_beginning_of_quarter

Returns a new Time representing the start of the quarter (1st of january, april, july, october, 0:00)



185
186
187
# File 'lib/active_support/core_ext/time/calculations.rb', line 185

def beginning_of_quarter
  beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
end

#beginning_of_weekObject Also known as: monday, at_beginning_of_week

Returns a new Time representing the “start” of this week (Monday, 0:00)



143
144
145
146
# File 'lib/active_support/core_ext/time/calculations.rb', line 143

def beginning_of_week
  days_to_monday = self.wday!=0 ? self.wday-1 : 6
  (self - days_to_monday.days).midnight
end

#beginning_of_yearObject Also known as: at_beginning_of_year

Returns a new Time representing the start of the year (1st of january, 0:00)



191
192
193
# File 'lib/active_support/core_ext/time/calculations.rb', line 191

def beginning_of_year
  change(:month => 1,:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
end

#change(options) ⇒ Object

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.



61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/active_support/core_ext/time/calculations.rb', line 61

def change(options)
  ::Time.send(
    self.utc? ? :utc_time : :local_time,
    options[:year]  || self.year,
    options[:month] || self.month,
    options[:day]   || self.day,
    options[:hour]  || self.hour,
    options[:min]   || (options[:hour] ? 0 : self.min),
    options[:sec]   || ((options[:hour] || options[:min]) ? 0 : self.sec),
    options[:usec]  || ((options[:hour] || options[:min] || options[:sec]) ? 0 : self.usec)
  )
end

#end_of_dayObject

Returns a new Time representing the end of the day (23:59:59)



165
166
167
# File 'lib/active_support/core_ext/time/calculations.rb', line 165

def end_of_day
  change(:hour => 23, :min => 59, :sec => 59)
end

#end_of_monthObject Also known as: at_end_of_month

Returns a new Time representing the end of the month (last day of the month, 0:00)



177
178
179
180
181
# File 'lib/active_support/core_ext/time/calculations.rb', line 177

def end_of_month
  #self - ((self.mday-1).days + self.seconds_since_midnight)
  last_day = ::Time.days_in_month( self.month, self.year )
  change(:day => last_day, :hour => 23, :min => 59, :sec => 59, :usec => 0)
end

#last_monthObject

Short-hand for months_ago(1)



133
134
135
# File 'lib/active_support/core_ext/time/calculations.rb', line 133

def last_month
  months_ago(1)
end

#last_yearObject

Short-hand for years_ago(1)



122
123
124
# File 'lib/active_support/core_ext/time/calculations.rb', line 122

def last_year
  years_ago(1)
end

#minus_with_duration(other) ⇒ Object

:nodoc:



214
215
216
217
218
219
220
# File 'lib/active_support/core_ext/time/calculations.rb', line 214

def minus_with_duration(other) #:nodoc:
  if ActiveSupport::Duration === other
    other.until(self)
  else
    minus_without_duration(other)
  end
end

#months_ago(months) ⇒ Object

Returns a new Time representing the time a number of specified months ago



102
103
104
# File 'lib/active_support/core_ext/time/calculations.rb', line 102

def months_ago(months)
  advance(:months => -months)
end

#months_since(months) ⇒ Object

Returns a new Time representing the time a number of specified months in the future



107
108
109
# File 'lib/active_support/core_ext/time/calculations.rb', line 107

def months_since(months)
  advance(:months => months)
end

#next_monthObject

Short-hand for months_since(1)



138
139
140
# File 'lib/active_support/core_ext/time/calculations.rb', line 138

def next_month
  months_since(1)
end

#next_week(day = :monday) ⇒ Object

Returns a new Time representing the start of the given day in next week (default is Monday).



151
152
153
154
# File 'lib/active_support/core_ext/time/calculations.rb', line 151

def next_week(day = :monday)
  days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
  since(1.week).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
end

#next_yearObject

Short-hand for years_since(1)



127
128
129
# File 'lib/active_support/core_ext/time/calculations.rb', line 127

def next_year
  years_since(1)
end

#plus_with_duration(other) ⇒ Object

:nodoc:



206
207
208
209
210
211
212
# File 'lib/active_support/core_ext/time/calculations.rb', line 206

def plus_with_duration(other) #:nodoc:
  if ActiveSupport::Duration === other
    other.since(self)
  else
    plus_without_duration(other)
  end
end

#seconds_since_midnightObject

Seconds since midnight: Time.now.seconds_since_midnight



54
55
56
# File 'lib/active_support/core_ext/time/calculations.rb', line 54

def seconds_since_midnight
  self.to_i - self.change(:hour => 0).to_i + (self.usec/1.0e+6)
end

#since(seconds) ⇒ Object Also known as: in

Returns a new Time representing the time a number of seconds since the instance time, this is basically a wrapper around the Numeric extension. Do not use this method in combination with x.months, use months_since instead!



91
92
93
94
95
96
97
98
# File 'lib/active_support/core_ext/time/calculations.rb', line 91

def since(seconds)
  initial_dst = self.dst? ? 1 : 0
  f = seconds.since(self)
  final_dst   = f.dst? ? 1 : 0
  (seconds.abs >= 86400 && initial_dst != final_dst) ? f + (initial_dst - final_dst).hours : f
rescue
  self.to_datetime.since(seconds)          
end

#tomorrowObject

Convenience method which returns a new Time representing the time 1 day since the instance time



202
203
204
# File 'lib/active_support/core_ext/time/calculations.rb', line 202

def tomorrow
  self.since(1.day)
end

#years_ago(years) ⇒ Object

Returns a new Time representing the time a number of specified years ago



112
113
114
# File 'lib/active_support/core_ext/time/calculations.rb', line 112

def years_ago(years)
  advance(:years => -years)
end

#years_since(years) ⇒ Object

Returns a new Time representing the time a number of specified years in the future



117
118
119
# File 'lib/active_support/core_ext/time/calculations.rb', line 117

def years_since(years)
  advance(:years => years)
end

#yesterdayObject

Convenience method which returns a new Time representing the time 1 day ago



197
198
199
# File 'lib/active_support/core_ext/time/calculations.rb', line 197

def yesterday
  self.ago(1.day)
end