Method: ActiveSupport::TimeWithZone#change
- Defined in:
- activesupport/lib/active_support/time_with_zone.rb
#change(options) ⇒ Object
Returns a new ActiveSupport::TimeWithZone where one or more of the elements have been changed according to the options parameter. The time options (:hour, :min, :sec, :usec, :nsec) reset cascadingly, so if only the hour is passed, then minute, sec, usec, and nsec is set to 0. If the hour and minute is passed, then sec, usec, and nsec is set to 0. The options parameter takes a hash with any of these keys: :year, :month, :day, :hour, :min, :sec, :usec, :nsec, :offset, :zone. Pass either :usec or :nsec, not both. Similarly, pass either :zone or :offset, not both.
t = Time.zone.now # => Fri, 14 Apr 2017 11:45:15.116992711 EST -05:00
t.change(year: 2020) # => Tue, 14 Apr 2020 11:45:15.116992711 EST -05:00
t.change(hour: 12) # => Fri, 14 Apr 2017 12:00:00.000000000 EST -05:00
t.change(min: 30) # => Fri, 14 Apr 2017 11:30:00.000000000 EST -05:00
t.change(offset: "-10:00") # => Fri, 14 Apr 2017 11:45:15.116992711 HST -10:00
t.change(zone: "Hawaii") # => Fri, 14 Apr 2017 11:45:15.116992711 HST -10:00
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 |
# File 'activesupport/lib/active_support/time_with_zone.rb', line 382 def change() if [:zone] && [:offset] raise ArgumentError, "Can't change both :offset and :zone at the same time: #{options.inspect}" end new_time = time.change() if [:zone] new_zone = ::Time.find_zone([:zone]) elsif [:offset] new_zone = ::Time.find_zone(new_time.utc_offset) end new_zone ||= time_zone periods = new_zone.periods_for_local(new_time) self.class.new(nil, new_zone, new_time, periods.include?(period) ? period : nil) end |