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

Instance Method Summary collapse

Instance Method Details

#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!


29
30
31
# File 'lib/active_support/core_ext/time/calculations.rb', line 29

def ago(seconds)
  seconds.until(self)
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)


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

def beginning_of_day
  self - self.seconds_since_midnight
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)


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

def beginning_of_month
  #self - ((self.mday-1).days + self.seconds_since_midnight)
  change(:mday => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
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)


89
90
91
92
# File 'lib/active_support/core_ext/time/calculations.rb', line 89

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)


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

def beginning_of_year
  change(:month => 1,:mday => 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.


14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/active_support/core_ext/time/calculations.rb', line 14

def change(options)
  ::Time.send(
    self.utc? ? :utc : :local, 
    options[:year]  || self.year, 
    options[:month] || self.month, 
    options[:mday]  || self.mday, 
    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[:usec]) ? 0 : self.usec)
  )
end

#last_monthObject

Short-hand for months_ago(1)


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

def last_month
  months_ago(1)
end

#last_yearObject

Short-hand for years_ago(1)


68
69
70
# File 'lib/active_support/core_ext/time/calculations.rb', line 68

def last_year
  years_ago(1)
end

#months_ago(months) ⇒ Object

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


41
42
43
44
45
46
47
# File 'lib/active_support/core_ext/time/calculations.rb', line 41

def months_ago(months)
  if months >= self.month 
    change(:year => self.year - 1, :month => 12).months_ago(months - self.month)
  else
    change(:year => self.year, :month => self.month - months)
  end
end

#months_since(months) ⇒ Object


49
50
51
52
53
54
55
56
# File 'lib/active_support/core_ext/time/calculations.rb', line 49

def months_since(months)
  if months + self.month > 12
    old_time = self
    change(:year => self.year + 1, :month => 1).months_since(months + old_time.month - 12 - 1)
  else
    change(:year => self.year, :month => self.month + months)
  end
end

#next_monthObject

Short-hand for months_since(1)


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

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).


97
98
99
100
# File 'lib/active_support/core_ext/time/calculations.rb', line 97

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)


73
74
75
# File 'lib/active_support/core_ext/time/calculations.rb', line 73

def next_year
  years_since(1)
end

#seconds_since_midnightObject

Seconds since midnight: Time.now.seconds_since_midnight


7
8
9
# File 'lib/active_support/core_ext/time/calculations.rb', line 7

def seconds_since_midnight
  self.hour.hours + self.min.minutes + self.sec + (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!


35
36
37
# File 'lib/active_support/core_ext/time/calculations.rb', line 35

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

#tomorrowObject

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


129
130
131
# File 'lib/active_support/core_ext/time/calculations.rb', line 129

def tomorrow
  self.since(1.day)
end

#years_ago(years) ⇒ Object

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


59
60
61
# File 'lib/active_support/core_ext/time/calculations.rb', line 59

def years_ago(years)
  change(:year => self.year - years)
end

#years_since(years) ⇒ Object


63
64
65
# File 'lib/active_support/core_ext/time/calculations.rb', line 63

def years_since(years)
  change(:year => self.year + years)
end

#yesterdayObject

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


124
125
126
# File 'lib/active_support/core_ext/time/calculations.rb', line 124

def yesterday
  self.ago(1.day)
end