def advance(options)
      # If we're advancing a value of variable length (i.e., years, weeks, months, days), advance from #time,
      # otherwise advance from #utc, for accuracy when moving across DST boundaries
      if options.values_at(:years, :weeks, :months, :days).any?
        method_missing(:advance, options)
      else
        utc.advance(options).in_time_zone(time_zone)
      end
    end
def advance(options)
      # If we're advancing a value of variable length (i.e., years, weeks, months, days), advance from #time,
      # otherwise advance from #utc, for accuracy when moving across DST boundaries
      if options.values_at(:years, :weeks, :months, :days).any?
        method_missing(:advance, options)
      else
        utc.advance(options).in_time_zone(time_zone)
      end
    end
Uses Date to provide precise Time calculations for years, months, and days
 according to the proleptic Gregorian calendar. The result is returned as a
 new TimeWithZone object.

 The +options+ parameter takes a hash with any of these keys:
 <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>,
 <tt>:hours</tt>, <tt>:minutes</tt>, <tt>:seconds</tt>.

 If advancing by a value of variable length (i.e., years, weeks, months,
 days), move forward from #time, otherwise move forward from #utc, for
 accuracy when moving across DST boundaries.

   Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
   now = Time.zone.now # => Sun, 02 Nov 2014 01:26:28 EDT -04:00
   now.advance(seconds: 1) # => Sun, 02 Nov 2014 01:26:29 EDT -04:00
   now.advance(minutes: 1) # => Sun, 02 Nov 2014 01:27:28 EDT -04:00
   now.advance(hours: 1)   # => Sun, 02 Nov 2014 01:26:28 EST -05:00
   now.advance(days: 1)    # => Mon, 03 Nov 2014 01:26:28 EST -05:00
   now.advance(weeks: 1)   # => Sun, 09 Nov 2014 01:26:28 EST -05:00
   now.advance(months: 1)  # => Tue, 02 Dec 2014 01:26:28 EST -05:00
   now.advance(years: 1)   # => Mon, 02 Nov 2015 01:26:28 EST -05:00